Win32 Dll编程详解
发表于:2007-07-01来源:作者:点击数:
标签:
/*此函数通过DEF文件导出,不会发生名字改编*/ int add1(int a,int b) { return a+b; } /*此函数通过DEF文件导出,不会发生名字改编 此函数的调用方式为_s td call */ int __stdcall add2(int a,int b) { return a+b; } /*此函数通过关键字__declspec(dllexp
/*此函数通过DEF文件导出,不会发生名字改编*/ int add1(int a,int b) { return a+b; }
/*此函数通过DEF文件导出,不会发生名字改编 此函数的调用方式为_stdcall */ int __stdcall add2(int a,int b) { return a+b; }
/*此函数通过关键字__declspec(dllexport)导出,会发生函数名的变化*/ __declspec(dllexport) int add3(int a,int b) { return a+b; }
/*此函数通过关键字__declspec(dllexport)导出,但由于使用了 extern "C",所以不会发生函数名的变化*/ extern "C" __declspec(dllexport) int add4(int a,int b) { return a+b; }
/*此函数通过关键字__declspec(dllexport)导出,尽管使用了extern "C", 但是函数的调用方式改为了__stdcall,所以还是会发生函数名改编*/ extern "C" __declspec(dllexport) int __stdcall add5(int a,int b) { return a+b; }
|
def文件:
LIBRARY Dll2
EXPORTS add1 add2 |
查看该dll的导出函数:
调用方法:
void CDllTestDlg::OnAdd1() { /*----------------动态加载动态连接库----------------------*/
HINSTANCE hInst=::LoadLibrary("Dll2.dll"); if(hInst) { typedef int (*ADD)(int,int); //定义一个函数指针类型 ADD pAdd=(ADD)::GetProcAddress(hInst,"add1"); if(pAdd) { CString str; str.Format("5+3=%d",pAdd(5,3)); MessageBox(str); }
::FreeLibrary(hInst); } }
第2个导出函数的调用: typedef int (__stdcall *ADD)(int,int); //定义一个函数指针类型 ADD pAdd=(ADD)::GetProcAddress(hInst,"add2");
第3个导出函数的调用: typedef int (*ADD)(int,int); //定义一个函数指针类型 ADD pAdd=(ADD)::GetProcAddress(hInst,""); //或者:ADD pAdd=(ADD)::GetProcAddress(hInst,MAKEINTRESOURCE(3));
第4个导出函数的调用: typedef int (*ADD)(int,int); //定义一个函数指针类型 ADD pAdd=(ADD)::GetProcAddress(hInst,"add4");
第5个导出函数的调用: typedef int (__stdcall *ADD)(int,int); //定义一个函数指针类型 ADD pAdd=(ADD)::GetProcAddress(hInst,"");
|
以上是动态加载dll. 以下是静态加载的方法:
/*------------------声明导入函数的方法----------------*/ #pragma comment(lib,"Dll1.lib")
/* 方法一:直接写出dll中函数的声明 int add(int a,int b); int sub(int a,int b);
方法二:通过关键字__declspec(dllimport)这种方法能够编译出效率更高的代码 __declspec(dllimport) int add(int a,int b); __declspec(dllimport) int sub(int a,int b);
方法三:直接包含dll的头文件 */ #include "Dll1.h" /*---------------------------------------------------------*/
|
然后直接调用dll中的函数:
void CDllTestDlg::OnAdd() { CString str; str.Format("1+2=%d",add(1,2)); MessageBox(str); } |
原文转自:http://www.ltesting.net