![]() |
威武的蜡烛 · 碳材料在电化学储能中的应用· 6 月前 · |
![]() |
胡子拉碴的长颈鹿 · 记录docker 部署nessus-CSDN博客· 8 月前 · |
![]() |
淡定的牛肉面 · 集群内访问(ClusterIP)--容器服务 ...· 1 年前 · |
![]() |
粗眉毛的柑橘 · GDB观察栈的内存布局_u014585564 ...· 1 年前 · |
![]() |
机灵的绿茶 · python ...· 2 年前 · |
静态链接库与动态链接库的区别:
(1) 静态链接库与动态链接库都是共享代码的方式。静态链接库把最后的指令都包含在最终生成的EXE文件中了;动态链接库不必被包含在最终EXE文件中,EXE文件执行时可以“动态”地引用和卸载这个与EXE独立的DLL文件。
(2) 静态链接库中不能再包含其他的动态链接库或者静态库,而在动态链接库中还可以再包含其他的动态或静态链接库。
动态链接库的分类: Visual C++支持三种DLL ,它们分别是:(1)Non-MFC DLL(非MFC动态库) :
非MFC动态库不采用MFC类库结构,其导出函数为标准的C接口,能被非MFC或MFC编写的应用程序所调用;(2)MFC Regular DLL(MFC规则DLL) :
MFC规则DLL 包含一个继承自CWinApp的类,但其无消息循环;(3)MFC Extension DLL(MFC扩展DLL): MFC扩展DLL采用MFC的动态链接版本创建,它只能被用MFC类库所编写的应用程序所调用。
而如果用其他工具来创建的exe来调用dll,就会出现问题。因为即使你不用C++编译器,Microsoft C编译器也会损害C函数。
当用__stdcall将函数输出时,C编译器会将函数改为_func@1的形式。在这里需要在.def文件中加入EXPORTS节来输出函数:
WINAPI都采用这种方式,而C/C++ 缺省的调用方式却为__cdecl。__stdcall方式与__cdecl对函数名最终生成符号的方式不同。
若采用C编译方式(在C++中需将函数声明为extern "C"),__stdcall调用约定在输出函数名前面加下划线,后面加“@”符号和参数的字节数,
形如_functionname@number;而__cdecl调用约定仅在输出函数名前面加下划线,形如_functionname。
lib.def : 导出DLL函数 LIBRARY dllTest EXPORTS add @ 1 .def文件的规则为: (1) LIBRARY语句说明.def文件相应的DLL; (2) EXPORTS语句后列出要导出函数的名称。可以在.def文件中的导出函数名后加@n,表示要导出函数的序号为n(在进行函数调用时,这个序号将发挥其作用);
(3) .def 文件中的注释由每个注释行开始处的分号 (;) 指定,且注释不能与语句共享一行。typedef int(*lpAddFun)(int, int); //宏定义函数指针类型
lpAddFun add;//函数指针 HINSTANCE hDll=LoadLibrary(“path”); add=(lpAddFun)GetProcAddress(hDll, "add");//获得dll中的add函数指针 FreeLibrary(hDll);将生成的.dll和.lib文件拷入到调用dll的工程中,用命令
BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
switch (ul_reason_for_call) case: DLL_PROCESS_ATTACH: break; case: DLL_THREAD_ATTACH: break; case: DLL_THREAD_DETACH: break; case: DLL_PROCESS_DETACH: break; return TRUE;在应用工程中引用DLL中全局变量的一个更好方法是:
class _declspec(dllexport) classname{
在类中引用的时候用 加入类定义头文件:#include “classname.h”
Class _declspec(dllimport) classname 来导入类我们可以在Visual C++中设置MFC规则DLL是静态链接到MFC DLL还是动态链接到MFC DLL。如图8,依次选择Visual C++的project -> Settings -> General菜单或选项,在Microsoft Foundation Classes中进行设置。
3.1规则DLL的创建;
3.2规则DLL的调用
(1) 显示方式LoadLibrary , GetProcAdress , FreeLibrary
(2) 我们照样可以在EXE程序中隐式调用MFC规则DLL ,只需要将DLL工程生成的.lib文件和.dll文件拷入当前工程所在的目录,并在cpp文件顶部添加:3.3共享MFC DLL的规则DLL的模块切换
应用程序进程本身及其调用的每个DLL模块都具有一个全局唯一的HINSTANCE句柄,它们代表了DLL或EXE模块在进程虚拟空间中的起始地址 。 进程本身的模块句柄一般为0x400000 , 而DLL模块的缺省句柄为0x10000000 。 如果程序同时加载了多个DLL,则每个DLL模块都会有不同的 HINSTANCE 。 应用程序在加载DLL时对其进行了重定位。4、扩展MFCDLL
1、 动态链接库是将exe程序在程序执行的时候动态加载的,而静态链接库是在编译的时 将其编译在代码之中的
2、 动态链接库可以输出变量、函数和类。其中每种输出的方式与调用方式不尽相同:#pragma comment(lib,"dllTest.lib")
(2)函数:在dll中定义