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

时间:2011-06-21 06:43:51

标签: dll linker

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

我创建了两个应用程序abc.exedef.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.exedef.exe)访问相同的DLL,但DLL的位置是相同的,即c:\Funky.dll。 我在while循环中调用两个应用程序中的Display函数,例如abc.exe

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

def.exe

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

现在显示功能为不同的应用程序打印不同的值。但变量的地址总是一样的。

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

提前多多感谢。

2 个答案:

答案 0 :(得分:1)

请参阅wikipedia

答案 1 :(得分:1)

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

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