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调试运行结果如下: