VC++ 静态DLL模板-全局变量

1、VS2003新建DLL项目dllTest

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

 1 #ifndef LIB_H
 2 #define LIB_H
 3 extern int dllGlobalVar;
 4 extern "C" int GetGlobalVar();
 5 extern "C" void SetGlobalVar(int value);
 6 //为了验证全局的字符变量定义导出dllGlobalStr
 7 extern char *dllGlobalStr;
 8 extern "C" char *GetGlobalStr();
 9 extern "C" void SetGlobalStr(char *value,int iLen);
10 #endif 

 

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

 1 #include "lib.h"
 2 #include <windows.h>
 3 #include <string.h>
 4  
 5 int dllGlobalVar;
 6 char *dllGlobalStr;
 7 
 8 BOOL APIENTRY DllMain( HANDLE hModule, 
 9                       DWORD  ul_reason_for_call, 
10                       LPVOID lpReserved
11                       )
12 {
13     switch (ul_reason_for_call)
14     {
15     case DLL_PROCESS_ATTACH:
16         dllGlobalVar = 100;
17         break;
18     case DLL_THREAD_ATTACH:    
19     case DLL_THREAD_DETACH:        
20     case DLL_PROCESS_DETACH:    
21         break;
22     }
23     return TRUE;
24 }
25 
26 int GetGlobalVar()
27 {
28    return dllGlobalVar;
29 }
30 
31 void SetGlobalVar(int value)
32 {
33     dllGlobalVar = value;
34 }
35 
36 char *GetGlobalStr()
37 {
38     return dllGlobalStr;
39 }
40 
41 void SetGlobalStr(char *value,int iLen)
42 {    
43     if(dllGlobalStr) delete dllGlobalStr;
44     dllGlobalStr = new char(iLen);
45     strcpy(dllGlobalStr,value);
46 }

 

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

 1 ;在DLL中导出变量
 2 LIBRARY "dllTest"
 3 EXPORTS
 4   dllGlobalVar CONSTANT  ;或dllGlobalVar DATA
 5   GetGlobalVar
 6   SetGlobalVar
 7     
 8   dllGlobalStr
 9   GetGlobalStr
10   SetGlobalStr

5、build生成dllTest.dll文件

6、添加检测项目dllCall

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

特别说明:为了验证全局的字符变量,增加了dllGlobalStr相关,设断点跟踪结果在char *sTemp2 = dllGlobalStr;发现指针丢失,而char *sTemp3 = GetGlobalStr();则正常返回。

结论:DLL中的全局变量引用最好还是通过接口定义所控制。

 1 #include "stdafx.h"
 2 #include <windows.h>
 3 #include <stdio.h>
 4 #pragma comment(lib,"..\\Debug\\dllTest.lib")
 5 
 6 extern int dllGlobalVar;
 7 extern "C" int _declspec(dllimport) GetGlobalVar();
 8 extern "C" void _declspec(dllimport) SetGlobalVar(int value);
 9 
10 extern char *dllGlobalStr;
11 extern "C" char _declspec(dllimport) *GetGlobalStr();
12 extern "C" void _declspec(dllimport) SetGlobalStr(char *value,int iLen);
13 
14 int main(int argc, char* argv[])
15 {
16     printf("%d\n",GetGlobalVar());
17     *(int *)dllGlobalVar = 1;
18     //特别要注意的是这种方法导出的并不是变量本身,而是DLL中导出变量的指针,应用程序必
19     //须通过强制指针转换来使用  
20     printf("%d\n",GetGlobalVar());
21     SetGlobalVar(20);
22     printf("%d\n",GetGlobalVar());
23 
24     printf("%s\n",GetGlobalStr());
25     char *sTemp = new char(6);
26     sTemp = "123434";
27     SetGlobalStr(sTemp,6);
28     printf("%s\n",GetGlobalStr());
29 
30     char *sTemp2 = dllGlobalStr;//指针丢失
31     char *sTemp3 = GetGlobalStr();
32     return 0;
33 }

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

posted @ 2013-10-28 10:03  Faint@LastStep  阅读(360)  评论(0编辑  收藏  举报