Отображение памяти DLL или распределение адресного пространства в исполняемом файле - PullRequest
1 голос
/ 21 июня 2011

Поправь меня, если я ошибаюсь.Вопрос связан с C ++ в приложении Windows Console.

Я создал два приложения, abc.exe и def.exe, и библиотеку DLL с именем Funky.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;
}

Теперь я обращаюсь к одной и той же DLL из двух разных приложений (то есть abc.exe и def.exe) но расположение библиотеки DLL такое же, то есть c:\Funky.dll.Я вызываю функцию Display в обоих приложениях в цикле while, например, для abc.exe:

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

и для def.exe:

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

Теперь функция отображения печатает разные значениядля различного применения.Но адрес переменной всегда один и тот же.

Может кто-нибудь объяснить это или предоставить ссылку, связанную с адресным пространством DLL в исполняемых файлах.

Заранее большое спасибо.

Ответы [ 2 ]

1 голос
/ 21 июня 2011

Каждый процесс, использующий вашу DLL, имеет свою собственную копию глобальных и статических переменных DLL. Чтобы обмениваться данными между процессами, вы должны вручную применить один из нескольких подходов - чаще всего используется создание общего раздела в DLL или через API файлов сопоставленных памяти.

Внимательно прочитайте все связанные с DLL материалы на MSDN ( отправная точка ), а еще лучше - получите копию Рихтера "Программирование приложений для Windows"

1 голос
/ 21 июня 2011
...