【问题标题】:Windows DLL global variablesWindows DLL 全局变量
【发布时间】:2012-01-16 15:32:26
【问题描述】:

加载到 Windows 应用程序中的 DLL 由入口点 (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(...)
    ...
}

我在这里缺少什么?线程呢?

【问题讨论】:

  • 为什么不按需打开,即第一次需要使用。然后在卸载 DLL 时关闭它。您可能需要定期刷新输出缓冲区。
  • 不确定你的意思。我已经澄清了上面的例子。
  • 我的意思是只打开一次文件,第一次有人想使用它。使用惰性初始化模式。
  • 正如我所说,如果我在包装函数中打开/关闭文件,它确实可以工作。但我不想那样做,因为开销太大。如果我只在 DllMain() 中打开它一次(所以每个附加进程/线程都应该有它)我似乎无法在其他函数中使用它,即使它是 DLL 的全局变量。

标签: windows dll global-variables


【解决方案1】:

Windows DLL 中的每个全局变量对于加载该 DLL 的每个进程都有一个实例。进程和全局变量实例之间存在一对一的映射。进程之间是完全隔离的,一个进程不能直接访问不同进程的内存。

如果您想在进程之间共享一个变量,那么您将需要某种形式的进程间通信 (IPC)。例如,您可以设置一个日志应用程序,您的 DLL 可以向其发送消息。

【讨论】:

  • 好吧,为什么上例中的文件在上面的 func() 函数中似乎没有打开,即使每次调用 DllMain() 时都会打开它?
  • 这是一个不同的问题,其答案无法从上面的代码中辨别出来。一定有其他事情发生。
  • 我不知道。如果您打开文件,但后来它没有打开,可能是打开失败或者它被关闭了。不过,从 DLLMain 调用 C++ 运行时函数显然是可疑的。也许这就是很难说的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多