动态连接库学习笔记
规则DLL(不能导出整个类,但可以使用MFC中的类)的导出与导入(显式—利用.def文件)
导出:
1:选择regular Dll using MFC Dll
2:在(项目名).cpp后填加函数的定义.在头文件处添加函数的声明.
3:在.def文件中的EXPORTS后填加函数名
比如://MyDll.cpp
Void DisplayAppName(){…}
//MyDll.h-----这一步是否必要?还没有验证.
Void DisplayAppName();
在.def中的EXPORTS后添加DisplayAppName
导入:
1:向项目中加入MyDll.lib库文件(Project->Add to Project注意,事先要把该文件放到项目中)
2:拷贝MyDll.dll文件到项目中或者Windows/system中
在使用的地方直接使用:LoadLibrary(“DisplayAppName”);DisplayAppName();----没有在使用前进行声明所以要用LoadLibrary()来显式导入.
特点:
导出部分和其他的没什么区别.导入部分容易忘记对.lib文件的处理.代码中使用函数也是很方便的.只用一个LoadLibrary(strFunName);就可以
规则DLL的导入导出(隐式---利用extern “C” _declspec(dllexport/dllimport))来声明函数----和其他的函数的声明原理是一样的.
导出:
1:在(项目名).cpp文件后面添加函数的定义部分;函数名前面和函数体前面都要添加代码,如:
Extern “C” _declspec(dllexport) double MyCube( int data){AFX_MANAGE_STATE(AfxGetStaticModuleState()); …}
声明后就可以和其他的函数一样填写函数体了.这样就搞定了.
导入:
1:当然是.lib和.dll文件的位置问题;.lib文件的导入问题(弄不好都会出错)
2:在要使用该导出函数的适当地方添加代码:extern “C” _declspec(dllimport) double MyCube(int data);
3:直接使用就可以了.
特点:
和前面的使用.def文件导出规则Dll文件中的函数一样方便.
扩展DLL(可以导出整个类,但还没有找到导出的详细资料.这里只导出函数.而且是非成员函数,在类的外面定义的函数)的导出与导入(显式)
导出:
1:在(项目名).cpp后填加函数的定义
2:在(项目名).def文件后填加 函数名
比如://MyDll.cpp-----MyDll为项目名称
Int max(int a,int b){…}
//MyDll.def中在EXPORTS后添加 max
导入:
1:只需要把.dll文件放到Windows/system或者项目文件夹中
2:根据.dll文件中的函数申明(返回类型,参数)来使用typedef int(*pMax)(int a,int b);
pMax Max;
3:HINSTANCE MyDll=NULL;
4:MyDll=AfxLoadLibrary(“MyDll.dll”);
5:Max=(pMax)GetProcAddress(MyDll,”函数名”);
6:函数名();//后面可以直接使用了
7:使用完了后记得要用AfxFreeLibrary(MyDll);释放资源
比如:typedef int(*pMax)(int a,int b);pMax Max;
HINSTANCE MyDll=NULL;
MyDll=AfxLoadLibrary(“MyDll.dll”);
Max=(pMax)GetProcAddress(MyDll,”Max”);
Max(i ,j );//直接使用了
…
AfxFreeLibrary(MyDll);
又一个例子
导出部分:int MaxNum(int a,int b)
{
return a>b?a:b;
}----.cpp文件中
EXPORTS
; Explicit exports can go here
MaxNum---.def文件中
typedef int(*pMaxNum)(int a,int b);----合适的地方加入
下面的为调用.dll函数的地方代码:
HINSTANCE MyDll=NULL;
MyDll=AfxLoadLibrary("5_dll.dll");
pMaxNum MaxNumber;
MaxNumber=(pMaxNum)GetProcAddress(MyDll,"MaxNum");
int i=MaxNumber(43,9);
CEdit* pEdit=(CEdit*)GetDlgItem(IDC_EDIT1);
char buffer[80];
sprintf(buffer,"%d",i);
pEdit->SetWindowText(buffer);
AfxFreeLibrary(MyDll);
特点:
导出部分也很简单;但是导入部分异常麻烦.其中步骤2和5很容易出错.但也有好处,可以使系统效率提高.
扩展DLL(导出整个类,导入用的是隐式调用-----头文件进行声明.方便,弹性大很多)
导出:
1:在要导出的类的前面添加AFX_EXT_CLASS.如:class AFX_EXT_CLASS CMyClass:public CObject;//当然首先你要创建一个有CObject派生的类CMyClass
2:删除语句” #include “/ add additional includes here”,删除整整一行.在建立的类的.cpp文件的开始部分.
导入:
1:当然要把.dll文件放到合适的地方.你要使用的类的头文件.h也要放到项目中(不是debug文件夹中,而是外面,和其他的.cpp和.h一起).还有要把.lib文件以新文件的方式添加到当前项目中(Project->Add to Project->Files,然后选择就可以了).这三个文件有两个文件.h和.lib是在同一个文件夹中的,而.dll文件放到合适的地方就好了.
2:在你要使用该类的地方添加.h.一般放在相应的头文件处;若很多地方要用到,可以考虑放到stdafx.h中.
3:正确的使用该类就可以了.象使用项目中的其他类一样就可以了.
比如:不好举例子.
特点
导入导出都非常的方便.不用象显式应用那样调用很多的函数.但是.lib文件的处理要特别的小心.这是很容易忘记的部分.