【发布时间】: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