如果我错了,请纠正我。 问题与Windows控制台应用程序上的C ++有关。
我创建了两个应用程序abc.exe
和def.exe
,以及一个名为Funky.dll
的DLL。我将DLL保存在C:\Funky.dll
位置。
DLL中有一个全局字符串变量,例如“字符串值;” 并且Dll公开的函数正在使用该变量。
以下是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函数,例如abc.exe
:
while(1)
{
Display("ABC",10);
}
和def.exe
:
while(1)
{
Display("DEF",10);
}
现在显示功能为不同的应用程序打印不同的值。但变量的地址总是一样的。
有人可以解释一下,或者提供与可执行文件中DLL的地址空间相关的链接。
提前多多感谢。
答案 0 :(得分:1)
请参阅wikipedia
答案 1 :(得分:1)
使用您的每个进程DLL都有自己的DLL全局变量和静态变量。为了在进程之间共享数据,您必须手动应用多种方法之一 - 最常用的是在DLL中创建共享节或通过内存映射文件API。
仔细阅读MSDN上所有与DLL相关的资料(starting point),甚至更好 - 获取Richter的“Windows编程应用程序”的副本