可执行文件中的 DLL 内存映射或地址空间分配
如果我错了请纠正我。 问题与 Windows 控制台应用程序上的 C++ 有关。
我创建了两个应用程序:abc.exe
和 def.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.exe
和 def.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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
请参阅维基百科
see wikipedia
每个使用 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"