外部指向 0x00000000

发布于 2024-10-11 12:54:27 字数 519 浏览 4 评论 0原文

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

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

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

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

有谁知道为什么会这样?我不明白为什么它以前有效,但现在不起作用。我根本没有更改这部分源代码的任何方面。 像这样使用extern指针来访问DLL中的BUFFER是否可以,还是有 有更好的方法吗?

感谢您的帮助。

I am using Microsoft Visual C++ 2010 Express, on Windows XP.

I have one application that produces a DLL, a header file in this application also declares a pointer to a BUFFER as an extern.
To register this DLL with the system, I drag it onto the regsvr32.exe icon in the system32 folder.

I have another application that tests the use of this DLL, by initialising and calling functions from it. This application accesses the same BUFFER as the DLL, by using this extern declaration.

At first, when I used the Visual Studio debugger to debug the test application, I could see the contents of the extern BUFFER from the loaded DLL. However, after repeatedly debugging this application, now the BUFFER does not display its memory address, just "0x0000000", so I can't view the data.

Does anyone know why this might be? I can't understand why it used to work, but now doesn't. I haven't changed any aspect of this part of the source code, at all.
Is it OK to access the BUFFER in the DLL by using an extern pointer like this, or is there
a better way?

Thanks for your help.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

南渊 2024-10-18 12:54:27

在 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 的评论所指出的,除非您使用 COM(组件对象模型)技术,否则使用 regsvr32.exe 注册您的 dll 库是没有意义的。

In C++ extern means, that variable is declared in another *.cpp (translation unit).
Example:
myfile1.cpp:

int globalVariable = 0;

myfile2.cpp:

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

If you need to export from dll, you must use dllexport (in library) and dllimport (in library consumer) for functions and variables, e.g.:
mylibrary.cpp:

__declspec(dllexport) int myGlobalExportingVariable = 0;

myprogram.cpp:

__declspec(dllimport) int myGlobalExportingVariable;

Of course, in real world, you would probably use something like this:
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();
//...

And you #include this header in both mylibrary.cpp and myprogram.cpp; don't forget to define MYLIBRARY macro in your project settings (C++ -> Preprocessor -> Preprocessor definitions).

By the way: as pointed in comment by PiotrLegnica, registering your dll library with regsvr32.exe is pointless unless you use technology COM (component object model).

找个人就嫁了吧 2024-10-18 12:54:27

当您使用 extern 声明变量时,意味着仅声明它但不定义它(没有为该变量分配内存),因为它在其他地方定义了它。
您可以使用 dll 代码在 cpp 文件中声明该变量。在标头中,使用 dllexport/import 将其设置为 extern,然后使用它。

When you declare a variable with extern then it’s mean only declare it but not define it( no memory allocation for that variable) because its define it other place.
You declare the variable in your cpp file with dll codes. In header make it as extern with dllexport/import and now use it.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文