预览加载中,请您耐心等待几秒...
1/4
2/4
3/4
4/4

在线预览结束,喜欢就下载吧,查找使用更方便

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

VisualStudio2010 DLL动态引用和静态应用的要求: 引用方式要求动态引用MyDLL.dll静态引用MyDLL.dll,MyDLL.lib,MyDLL.h 静态加载DLL的步骤如下: 将MyDLL.dll,MyDLL.lib,MyDLL.h拷贝到目标工程(需调用MyDLL.DLL的工程)的Debug目录下。 配置头文件路径:选择项目->属性->C/C++->常规->附加包含目录:设置头文件路径。 配置DLL和LIB文件路径:选择项目->属性->连接器->常规->附加库目录:设置DLL和LIB文件路径。 加载Lib文件: 方法一:选择项目->属性->连接器->输入->附加依赖项:输入要加载的Lib文件名(加载多个Lib文件时,以回车为分隔符)。 方法二:在程序中使用#pragmacomment(lib,"MyDLL.lib")进行设定。 配置该应用程序.exe的生成目录要和加载的DLL、LIB放在同一目录:选择项目->属性->连接器->常规->输出文件。 在目标工程(*.cpp,需要调用DLL中的函数)中加入:#include"MyDLL.h" 动态加载DLL的步骤如下: 声明头文件<windows.h>,说明要用windows32方法来加载和卸载DLL。 例如:#include<Windows.h> 用typedef定义一个函数指针类型,这个指针类型要与调用的DLL引出函数类型和参数保持一致。 例如:typedefvoid(*FUN)(int,int); 通过Win32API函数LoadLibrary()显式的调用DLL,此函数返回DLL的实例句柄。这里字符串类型是LPSTR,当是unicode字符集的时候会不行,因此要在配置-属性-常规里面把默认字符集“unicode”改成支持多字符扩展即可。 例如:constchar*dllName="MyDLL.dll"; HMODULEhDLL=LoadLibrary(dllName); 取到的地址要判断返回的句柄是否为空,如果为无效句柄,那么要释放加载DLL所占用的内存。 例如:if(hDLL!=NULL) { } else { FreeLibrary(hdll) } 定义一个函数指针,用来获取你要用的函数地址,通过GetProcAdress来获取函数的地址,这里也要判断要函数指针是否为空,如果没取到要求的函数,那么要释放句柄。 例如:FUNfp=FUN(GetProcAddress(hDLL,funName)); if(fp!=NULL) { } 通过函数指针来调用函数。这里不能用函数名来使用函数,因为这个DLL本身不是当前CPP的一部分,而是通过windows去调用。 例如:fp(x,y) 最后调用结束后,就释放句柄。 例如:FreeLibrary(hdll) 要点 包含头文件Windows.h,原因在于程序中用到了LoadLibrary、FreeLibrary、GetProcAddress等Win32API函数。 FUNA和FUNB是函数指针类型的声明。 当程序不再使用dll时,应该调用FreeLibrary及时释放它占用的内存空间。 如果在constchar*dllName和funName底部出现红色波浪线提示,说明采用的字符集不匹配,需要修改项目UseDLL的属性CharaterSet为NotSet。 为方便项目的调试,建议修改解决方案的StartupProject属性为Singlestartupproject并以UseDLL为首选。 以具体实例说明动态加载DLL MyDLL.h文件为: #ifdefMyDLL_EXPORTS #defineMyDLL_API__declspec(dllexport) #else #defineMyDLL_API__declspec(dllimport) #endif MyLL_APIvoidAdd(int,int); 修改MyDLL.cpp文件为: MyDLL_APIvoidAdd(inta,intb) { returna+b; } 使用DLL的代码: #include<Windows.h> typedefvoid(*FUN)(int,int); intmain() { constchar*dllName="MyDLL.dll"; constchar*funName="Add"; intx(100),y(100); HMODULEhDLL=LoadLibrary(dllName); if(hDLL!=NULL) { FUNAfp=FUNA(GetProcAddress(hDLL,funName)); if(fp!=NULL) { intsum=fp(x