博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
VC++ 动态DLL模板-DllMain函数
阅读量:5150 次
发布时间:2019-06-13

本文共 2694 字,大约阅读时间需要 8 分钟。

1、VS2003新建DLL项目dllTest

2、项目dllTest中添加脚本lib.h,代码如下:

1 #ifndef LIB_H2 #define LIB_H3 extern "C" int add(int x,int y);4 extern "C" int mius(int x,int y);5 #endif

 

3、项目dllTest中添加脚本lib.cpp,代码如下:

 

1 #include "lib.h" 2 #include "windows.h" 3 #include "stdio.h" 4  5 //如果程序员没有为DLL模块编写一个DLLMain函数,系统会从其它运行库中引入一个不做任何操作的 6 //缺省DLLMain函数版本。在单个线程启动和终止时,DLLMain函数也被调用。正如由dwReason参数所 7 //表明的那样。 8 BOOL APIENTRY DllMain( HANDLE hModule,     9 /*10     进程中的每个DLL模块被全局唯一的32字节的HINSTANCE句柄标识进程自己还有一个HINSTANCE句柄。11 所有这些模块句柄都只有在特定的进程内部有效,它们代表了DLL或EXE模块在进程虚拟空间中的起始12 地址。在Win32中,HINSTANCE和HMODULE的值是相同的,这两种类型可以替换使用。进程模块句柄几乎13 总是等于0x400000,而DLL模块的加载地址的缺省句柄是0x10000000。如果程序同时使用了几个DLL模14 块,每一个都会有不同的HINSTANCE值。这是因为在创建DLL文件时指定了不同的基地址,或者是因为15 加载程序对DLL代码进行了重定位。 16 */17                         DWORD  ul_reason_for_call, 18                       LPVOID lpReserved19                       )20 {21     switch (ul_reason_for_call)22     {23     case DLL_PROCESS_ATTACH:24         printf("\nprocess attach of dll");25         break;26     case DLL_THREAD_ATTACH:27         printf("\nthread attach of dll");28         break;29     case DLL_THREAD_DETACH:30         printf("\nthread detach of dll");31         break;32     case DLL_PROCESS_DETACH:33         printf("\nprocess detach of dll");34         break;35     }36     return TRUE;37 }38 39 int add(int x,int y)40 {41     return x + y;42 }43 int mius(int x,int y)44 {45     return x - y;46 }

4、项目dllTest中添加脚本lib.def,代码如下:

 

1 LIBRARY LIB2 EXPORTS3 add @ 14 mius @ 2

 

5、build生成dllTest.dll文件

 

6、添加检测项目dllCall

7、添加主程序脚本dllCall.cpp,代码如下:

特别说明:MAKEINTRESOURCE(1)等同def中定义的对应函数名称。

 

1 #include "stdafx.h" 2 #include "windows.h" 3  4 typedef int (* lpAddFun)(int,int); 5   6 int main(int argc, char* argv[]) 7 { 8     HINSTANCE hDll;  9     lpAddFun addFun;10     hDll = LoadLibrary("..\\Debug\\dllTest.dll");11     if (hDll != NULL)12     {13     //    addFun = (lpAddFun)GetProcAddress(hDll,"add");    14         addFun = (lpAddFun)GetProcAddress(hDll,MAKEINTRESOURCE(1));15         //MAKEINTRESOURCE直接使用导出文件中的序号16         if(addFun!=NULL)17         {18             int result =  addFun(2,3);    19             printf("\ncall add in dll:%d",result);20         }    21 22         addFun = (lpAddFun)GetProcAddress(hDll,MAKEINTRESOURCE(2));23         //MAKEINTRESOURCE直接使用导出文件中的序号24         if(addFun!=NULL)25         {26             int result =  addFun(2,3);    27             printf("\ncall mius in dll:%d",result);28         }29         FreeLibrary(hDll);30     }    31     getchar();32       return 0;33 }

 

 

 

8、Ctrl+F5调试运行结果如下:

特别说明:这里看到的process attach和detach,若是在dll中有线程存在,且封装在接口add或mius中,则会在process attach后执行相应的thread attacth和detach。

 

 

 

转载于:https://www.cnblogs.com/jonathan236/p/3387593.html

你可能感兴趣的文章