您的位置:首页 > 编程语言 > C语言/C++

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

2013-10-28 10:03 429 查看
1、VS2003新建DLL项目dllTest





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

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


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

#include "lib.h"
#include <windows.h>
#include <string.h>

int dllGlobalVar;
char *dllGlobalStr;

BOOL APIENTRY DllMain( HANDLE hModule,
DWORD  ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
dllGlobalVar = 100;
break;
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}

int GetGlobalVar()
{
return dllGlobalVar;
}

void SetGlobalVar(int value)
{
dllGlobalVar = value;
}

char *GetGlobalStr()
{
return dllGlobalStr;
}

void SetGlobalStr(char *value,int iLen)
{
if(dllGlobalStr) delete dllGlobalStr;
dllGlobalStr = new char(iLen);
strcpy(dllGlobalStr,value);
}


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

;在DLL中导出变量
LIBRARY "dllTest"
EXPORTS
dllGlobalVar CONSTANT  ;或dllGlobalVar DATA
GetGlobalVar
SetGlobalVar

dllGlobalStr
GetGlobalStr
SetGlobalStr


5、build生成dllTest.dll文件

6、添加检测项目dllCall





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

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

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

#include "stdafx.h"
#include <windows.h>
#include <stdio.h>
#pragma comment(lib,"..\\Debug\\dllTest.lib")

extern int dllGlobalVar;
extern "C" int _declspec(dllimport) GetGlobalVar();
extern "C" void _declspec(dllimport) SetGlobalVar(int value);

extern char *dllGlobalStr;
extern "C" char _declspec(dllimport) *GetGlobalStr();
extern "C" void _declspec(dllimport) SetGlobalStr(char *value,int iLen);

int main(int argc, char* argv[])
{
printf("%d\n",GetGlobalVar());
*(int *)dllGlobalVar = 1;
//特别要注意的是这种方法导出的并不是变量本身,而是DLL中导出变量的指针,应用程序必
//须通过强制指针转换来使用
printf("%d\n",GetGlobalVar());
SetGlobalVar(20);
printf("%d\n",GetGlobalVar());

printf("%s\n",GetGlobalStr());
char *sTemp = new char(6);
sTemp = "123434";
SetGlobalStr(sTemp,6);
printf("%s\n",GetGlobalStr());

char *sTemp2 = dllGlobalStr;//指针丢失
char *sTemp3 = GetGlobalStr();
return 0;
}


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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: