VC++ 动态DLL模板-DllMain函数

1、VS2003新建DLL项目dllTest

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

1 #ifndef LIB_H
2 #define LIB_H
3 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 lpReserved
19                       )
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 LIB
2 EXPORTS
3 add @ 1
4 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。

 

 

 

posted @ 2013-10-25 11:32  Faint@LastStep  阅读(896)  评论(0编辑  收藏  举报