Глобальные переменные Windows DLL - PullRequest
0 голосов
/ 09 декабря 2011

DLL, загружаемая в приложение Windows, состоит из точки входа (DLLMain ()) и других функций, которые можно вызывать оттуда.Теперь, как мне сделать переменную глобальной среди всех этих функций для каждого процесса и потока, который присоединяется к этой DLL?

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

wofstream wofstr;

int WINAPI func(LPCWSTR lpString) 
{
  ...
  //wofstr.open(...);
  wofstr << lpString << endl; // *** NOT working without opening in this very function
  ...
  //wofstr.close(...);
  ...
}

BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
    ...
    case DLL_PROCESS_ATTACH:
        wofstr.open(...); // *** NOT seen in function above
    ...
    case DLL_THREAD_ATTACH:
    ...
    case DLL_THREAD_DETACH:
    ...
    case DLL_PROCESS_DETACH:
        wofstr.close(...)
    ...
}

Чего мне здесь не хватает?А как насчет темы?

1 Ответ

0 голосов
/ 11 декабря 2011

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

Если вы хотите разделить переменную между процессами, вам потребуется некоторая форма межпроцессного взаимодействия (IPC). Например, вы можете настроить приложение для ведения журнала, в которое ваша DLL может отправлять сообщения.

...