DLL 的创建与调用 1、 DLL 的概念 DLL(Dynamic Linkable Library),动态链接库,可以向程序提供一些函数、变量或类。这些可以直接拿来使用。 静态链接库与动态链接库的区别: ( 1)静态链接库与动态链接库都是共享代码的方式。静态链接库把最后的指令都包含在最终生成的EXE文件中了;动态链接库不必被包含在最终EXE 文件中,EXE 文件执行时可以“动态”地引用和卸载这个与EXE 独立的DLL 文件。 ( 2) 静态链接库中不能再包含其他的动态链接库或者静态库,而在动态链接库中还可以再包含其他的动态或静态链接库。 动态链接库的分类:Visual C++支持三种DLL,它们分别是Non-MFC DLL(非MFC 动态库)、MFC Regular DLL( MFC 规则DLL)、MFC Extension DLL( MFC 扩展DLL)。非MFC 动态库不采用MFC类库结构,其导出函数为标准的C 接口,能被非MFC 或 MFC 编写的应用程序所调用;MFC 规则DLL 包含一个继承自CWinApp 的类,但其无消息循环;MFC 扩展DLL 采用MFC 的动态链接版本创建,它只能被用MFC 类库所编写的应用程序所调用。 2、 创建一个DLL 2.1 非 M FC 的 DLL 2.1.1 声明导出函数: extern “C” __declspec(dllexport) int add(int a, int b); 其中 extern “C”为声明为C 编译。由于C++编译器在编译的时候会造成其函数名的该变,在其他应用程序中导致函数不可调用,而C 编译器则不会在编译后改变其函数名。这样如果用C 编译的程序来调用该dll 中的函数时,可能会造成找不到该函数。 __declspec( dllexport)表示该函数为DLL 输出函数,即其他应用程序可以调用该函数 从 dll 中声明输出函数有两种方式: ( 1) 另外一种方式是采用模块定义(.def) 文件声明,.def 文件为链接器提供了有关被链接程序的导出、属性及其他方面的信息。 ( 2) 用 __declspec(dllexport)来声明函数 如果使用Visual C++来创建dll,对于同样用VC 创建的exe 来说,调用dll 没有什么问题。而如果用其他工具来创建的exe 来调用dll,就会出现问题。因为即使你不用C++编译器,Microsoft C 编译器也会损害C 函数。当用__stdcall 将函数输出时,C 编译器会将函数改为_func@1 的形式。在这里需要在.def文件中加入EXPORTS 节来输出函数: EXPORTS func 这样,dll 将用func 函数名来输出函数。 另一种方式是用#pragma (linker, “/exports:func=_func@1”),告诉编译器...