我在Windows XP上使用Microsoft Visual C ++ 2010 Express。
我有一个生成DLL的应用程序,此应用程序中的头文件也声明指向BUFFER的指针作为extern。 要在系统中注册此DLL,我将其拖到system32文件夹中的regsvr32.exe图标上。
我有另一个应用程序通过初始化和调用它的函数来测试这个DLL的使用。此应用程序通过使用此extern声明访问与DLL相同的BUFFER。
首先,当我使用Visual Studio调试器调试测试应用程序时,我可以从加载的DLL中看到extern BUFFER的内容。但是,在反复调试这个应用程序之后,现在BUFFER没有显示其内存地址,只是“0x0000000”,所以我无法查看数据。
有谁知道为什么会这样?我不明白为什么它曾经工作过,但现在却没有。我根本没有改变这部分源代码的任何方面。 可以通过使用这样的extern指针访问DLL中的BUFFER,或者是否存在 更好的方法?
感谢您的帮助。
答案 0 :(得分:1)
在C ++中, extern 表示该变量在另一个* .cpp(翻译单元)中声明。 例: myfile1.cpp:
int globalVariable = 0;
myfile2.cpp:
extern int globalVariable; //same variable, because of extern
如果您需要从dll 导出,则必须使用dllexport(在库中)和dllimport(在库使用者中)来获取函数和变量,例如: mylibrary.cpp:
__declspec(dllexport) int myGlobalExportingVariable = 0;
myprogram.cpp:
__declspec(dllimport) int myGlobalExportingVariable;
当然,在现实世界中,你可能会使用这样的东西: mylibrary.hpp:
#ifdef MYLIBRARY
#define MYLIBRARY_ITEM __declspec(dllexport)
#else
#define MYLIBRARY_ITEM __declspec(dllimport)
#endif
MYLIBRARY_ITEM void func1();
MYLIBRARY_ITEM int variable0;
MYLIBRARY_ITEM float func2();
//...
你在mylibrary.cpp和myprogram.cpp中#include这个标题;不要忘记在项目设置中定义MYLIBRARY宏(C ++ - >预处理器 - >预处理器定义)。
顺便说一句:正如PiotrLegnica的评论所指出的那样,使用regsvr32.exe注册你的dll库是没有意义的,除非你使用技术COM(组件对象模型)。
答案 1 :(得分:0)
当你用extern声明一个变量时,它意味着只声明它但不定义它(没有为该变量分配内存)因为它定义了它的其他地方。 您使用dll代码在cpp文件中声明变量。在标题中使用dllexport / import将其设置为extern,现在使用它。