建立WIN32 DLL,并使用静态加载和动态加载

来源:互联网 发布:js 对象 函数 编辑:程序博客网 时间:2024/06/05 06:13

新建工程,选择win32 dll

编写.cpp(或.c)

MyDll.cpp

#include "windows.h" BOOL APIENTRY DllMain(HANDLE hModule,DWORD ul_reason_for_call,LPVOID lpReserved){return TRUE; } extern "C" _declspec(dllexport)int sum(int a, int b) //extern "C" int sum(int a, int b) {return a+b;}

extern "C"
(1) 被extern限定的函数或变量是extern类型的
如果文件a.c需要引用b.c中变量int v,就可以在a.c中声明externint v  被引用的变量v的链接属性必须是外链接(external)的
(2) 被extern "C"修饰的变量和函数是按照C语言方式编译和连接的
C和C++编译产生的函数名不同,C为_name,C++为_name_int_int这样的名字包含了函数名、函数参数数量及类型信息,C++就是靠这种机制来实现函数重载的
可以使用__declspec(dllexport)关键字从 DLL 导出数据、函数、类或类成员函数。
__declspec(dllexport)将导出指令添加到对象文件,若要导出函数,__declspec(dllexport)关键字必须出现在调用约定关键字的左边(如果指定了关键字)。
例如:
__declspec(dllexport) void __cdecl Function1(void);
若要导出类中的所有公共数据成员和成员函数,关键字必须出现在类名的左边,如下所示:
class __declspec(dllexport) CExampleExport : public CObject
{ ... class definition ... };


或者使用def文件告诉编译器不要改函数的名字

可以在这工程里面加一个.h头文件,将要用的函数包含进去,在使用DLL的时候将.h文件拷贝到工程目录下,直接#include进.h,就不用声明函数了。

静态包含DLL

建立win32 console app   UseDll

UseDll.c

#include <stdio.h>#pragma comment(lib,"MFCDll"); //或者在project->set->link里面引入int sum(int a, int b);//函数声明,若有.h头文件,加入即可int main(){k = sum(1, 2);printf("%d \n", k);return 0;}


将.dll(动态库)放入运行程序目录里,将.lib(引入库)放入工程目录下


动态加载DLL

建立win32 console app   UseDll

UseDll.c

#include <stdio.h>#pragma comment(lib,"MFCDll"); //或者在project->set->link里面引入int sum(int a, int b);//函数声明,若有.h头文件,加入即可typedef int (*FUN)( );//指向函数的指针FUN,在C中,空为0或多个参数,C++中...为0或多个参数。指针函数在函数参数中可用int (*)()FUN   fun;HINSTANCE hInstance;//FARPROC lpFunction;//查看宏可知其为远指针,指向使用_stdcall调用约定(C++默认调用约定,此处加载的DLL为C程序默认使用_cdecl)的函数int k;int main(){hInstance = LoadLibrary("MyDll.dll");if(!hInstance)printf("Not Find this Dll \n");fun = (FUN)GetProcAddress(hInstance, "sum")if (!fun)printf("not find this fun \n");k = fun(1, 2);printf("%d \n", k);return 0;}


0 0