c++ - 外部指向 0x00000000

标签 c++ visual-c++ extern

我在 Windows XP 上使用 Microsoft Visual C++ 2010 Express。

我有一个生成 DLL 的应用程序,该应用程序中的一个头文件还声明了一个指向 BUFFER 的指针作为 extern。 为了向系统注册此 DLL,我将其拖到 system32 文件夹中的 regsvr32.exe 图标上。

我有另一个应用程序通过初始化和调用函数来测试此 DLL 的使用。此应用程序通过使用此外部声明访问与 DLL 相同的 BUFFER。

起初,当我使用 Visual Studio 调试器调试测试应用程序时,我可以从加载的 DLL 中看到 extern BUFFER 的内容。但是,经过反复调试这个应用程序,现在BUFFER不显示它的内存地址,只是“0x0000000”,所以我无法查看数据。

有人知道这是为什么吗?我不明白为什么它以前可以工作,但现在不行了。我根本没有更改这部分源代码的任何方面。 是否可以使用这样的外部指针访问 DLL 中的 BUFFER,或者是否存在 有更好的方法吗?

感谢您的帮助。

最佳答案

在 C++ 中,extern 表示该变量在另一个 *.cpp(翻译单元)中声明。 例子: 我的文件 1.cpp:

int globalVariable = 0;

我的文件2.cpp:

extern int globalVariable; //same variable, because of extern

如果您需要从 dll 中导出,您必须对函数和变量使用 dllexport(在库中)和 dllimport(在库消费者中),例如: 我的图书馆.cpp:

__declspec(dllexport) int myGlobalExportingVariable = 0;

我的程序.cpp:

__declspec(dllimport) int myGlobalExportingVariable;

当然,在现实世界中,你可能会使用这样的东西: 我的图书馆.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 在评论中指出的那样,除非您使用技术 COM(组件对象模型),否则使用 regsvr32.exe 注册您的 dll 库是没有意义的。

关于c++ - 外部指向 0x00000000,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4655602/

相关文章:

c++ - 使用 FOR 循环将数据放入 ref 数组

c++ - 这个 CG 程序我做错了什么吗?

c++ - 为什么我可以使用非 const 变量来接收 const 函数

c - 允许 "overriding"具有内部链接的零初始化对象

c - 全局声明的变量是外部变量还是静态变量?

c++ - 在 lambda 函数中使用 auto

c++ - 如何在 Visual Studio 中设置编译标志/bigobj?

visual-studio - visual studio vc++ 的静态代码内存泄漏检测

c++ - 如何使用 C++ 形式的 TextBox 文本?

c++ - C++中使用extern共享变量