可执行文件中的 DLL 内存映射或地址空间分配

发布于 2024-11-16 07:18:43 字数 1343 浏览 3 评论 0原文

如果我错了请纠正我。 问题与 Windows 控制台应用程序上的 C++ 有关。

我创建了两个应用程序:abc.exedef.exe,以及一个名为 Funky.dll 的 DLL。我将 DLL 保存在 C:\Funky.dll 位置。

DLL中有一个全局字符串变量,例如“string Value;” Dlls 公开的函数正在使用该变量。

下面是 DLL 代码:

#include<header files etc>

string Value;

#ifdef _MANAGED
#pragma managed(push, off)
#endif

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{


    return TRUE;
}

#ifdef _MANAGED
#pragma managed(pop)
#endif

extern "C" __declspec(dllexport) string Display(string str, int val)
{

    value=str;
    cout<<"\n************I am in a FunkyDLL************\n";
    cout<<"\n"<<value;
    cout<<"\n"<<val;
    printf("\nAddress Space %u::",&value);



return value;
}

现在我从两个不同的应用程序(即 abc.exedef.exe)访问相同的 DLL,但 DLL 的位置是相同的,即c:\Funky.dll。 我在 while 循环中调用两个应用程序中的 Display 函数,例如 for abc.exe:

while(1)
{
Display("ABC",10);
}

和 for def.exe:

while(1)
{
Display("DEF",10);
}

现在,显示函数为不同的应用程序打印不同的值。但变量的地址始终是相同的。

有人可以解释一下或者提供与可执行文件中 DLL 地址空间相关的链接吗?

预先非常感谢。

Correct me if i am wrong.
Question is related to C++ on Windows Console application.

I created two applications, abc.exe and def.exe, and a DLL called Funky.dll. I kept the DLL at location C:\Funky.dll.

There is a global string variable in the DLL e.g. "string Value;"
And Dlls exposed function is using that variable.

Below is the DLL code:

#include<header files etc>

string Value;

#ifdef _MANAGED
#pragma managed(push, off)
#endif

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{


    return TRUE;
}

#ifdef _MANAGED
#pragma managed(pop)
#endif

extern "C" __declspec(dllexport) string Display(string str, int val)
{

    value=str;
    cout<<"\n************I am in a FunkyDLL************\n";
    cout<<"\n"<<value;
    cout<<"\n"<<val;
    printf("\nAddress Space %u::",&value);



return value;
}

Now I am accessing the same DLL from two different applications (i.e. abc.exe and def.exe) but the location of the DLL is the same, i.e. c:\Funky.dll.
I call the Display function in both applications in while loop, e.g. for abc.exe:

while(1)
{
Display("ABC",10);
}

and for def.exe:

while(1)
{
Display("DEF",10);
}

Now the display function printing the different values for different application. But the address of the variable is always the same.

Can someone please explain it or provide the link related to address space of DLL in executables.

Thanks a lot in advance.

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

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

发布评论

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

评论(2

九厘米的零° 2024-11-23 07:18:43

每个使用 DLL 的进程都有自己的 DLL 全局变量和静态变量的副本。为了在进程之间共享数据,您必须手动应用多种方法之一 - 最常用的是在 DLL 中或通过内存映射文件 API 创建共享部分。

仔细阅读 MSDN 上所有与 DLL 相关的材料(开始点)甚至更好 - 获取 Richter 的“Windows 编程应用程序”的副本

Each process using you DLL has its own copy of DLL global and static variables. In order to share data between processes you have to manually apply one of the multiple approaches - most oftenly used are making a shared section in a DLL or via the memory mapped files API.

Read carefully all DLL-related material on MSDN (starting point) and even better - get a copy of Richter's "Programming aplications for Windows"

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