dll调用全局变量 出错

mathcn 2007-07-18 11:26:33
我用的是 vs2005

dlltest工程:

lib.h

#ifndef LIB_H
#define LIB_H
extern int dllGlobalVar;
extern "C" int GetGlobalVar();
#endif

lib.cpp

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

int dllGlobalVar;

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_DETACH:
case DLL_THREAD_ATTACH:
case DLL_PROCESS_DETACH:
break;



}
return TRUE;

}

int GetGlobalVar()
{
return dllGlobalVar;

}

lib.def
LIBRARY "Dlltest"

EXPORTS
;或dllGlobalVar CONSTANT
dllGlobalVar DATA
GetGlobalVar

CallDll工程:
#include <windows.h>
#include <stdio.h>
#pragma comment(lib,"dllTest.lib")
extern "C" _declspec(dllimport)int GetGlobalVar();
extern int dllGlobalVar;

int main(int argc, char* argv[])
{
printf("%d ",GetGlobalVar());

*(int *)dllGlobalVar = 1;
//特别要注意的是这种方法导出的并不是变量本身,而是DLL中导出变量的指针,应用程序必
//须通过强制指针转换来使用

printf("%d ",GetGlobalVar());

scanf("rr");
return 0;
}


出错:

错误 1 error LNK2001: 无法解析的外部符号 "int dllGlobalVar" (?dllGlobalVar@@3HA) dllcall.obj
错误 2 fatal error LNK1120: 1 个无法解析的外部命令 E:\Ebook\学习笔记\C++APIWIN32MFC\029_DLL动态链接库导出全局变量\Debug\DllCall.exe 1


...全文
386 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
mathcn 2007-07-20
  • 打赏
  • 举报
回复
有人能写下代码吗? 我试了下 上面说得 都不行啊 我是菜鸟 大家别笑话俺啊
AgedBOY 2007-07-19
  • 打赏
  • 举报
回复
“学习笔记\C++APIWIN32MFC\029_DLL动态链接库导出全局变量”中一定要你用.def文件导出全局变量吗?如果不是有什么特殊用意的话,就不该这么导出。

正解应该是在DLL中声明dllGlobalVar的时候加上“_declspec(dllexport)”关键字。这样,在CallDll中用_declspec(dllimport) int dllGlobalVar就可以了。

其实你应该用向导生成一个“Win32 Project | DLL”,并且把“Export symbols”选项勾上。生成工程后,如何导出函数、全局变量、C++类,你就一目了然了。
lyg_zy 2007-07-18
  • 打赏
  • 举报
回复
去掉extern "C" _declspec(dllimport)int GetGlobalVar();这句.
1:
把这句改到dll的一头文件比如export.h里
int GetGlobalVar();
2:在你使用dll的工程里
#include 这个头文件就可以了。
yjgx007 2007-07-18
  • 打赏
  • 举报
回复
不要用转出文件方式导出,用标准C方式导出.

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧