我正在从dll创建(临时)日志文件。但是我定义的全局变量似乎不一致。
以下是我在dll主cpp文件中定义变量的方法。
char * g_bfr;
__declspec(dllexport) CMemFile memFile;
然后在DllMain函数中:
extern "C" int APIENTRY
DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
// Remove this if you use lpReserved
UNREFERENCED_PARAMETER(lpReserved);
if (dwReason == DLL_PROCESS_ATTACH)
{
TRACE0("UTLADO.DLL Initializing!\n");
g_bfr = new char[1000]();
memFile.Attach((BYTE*)g_bfr, 1000 );
// Extension DLL one-time initialization
if (!AfxInitExtensionModule(AcnDll, hInstance))
return 0;
new CDynLinkLibrary(AcnDll);
}
else if (dwReason == DLL_PROCESS_DETACH)
{
TRACE0("UTLADO.DLL Terminating!\n");
delete[] g_bfr;
// Terminate the library before destructors are called
AfxTermExtensionModule(AcnDll);
}
return 1; // ok
}
问题是当我在dll中使用memFile将日志写入内存时,在某个地方,它变得很糟糕,好像新声明的那样(未初始化)。请参阅文件位置/大小全部重置的位置。
当我在DllMain中设置断点时,更奇怪的是,在case DLL_PROCESS_ATTACH
内,它永远不会中断(就像从未调用过),但初始化确实有效! case DLL_PROCESS_DETACH
中的断点确实有效,只有在我关闭应用程序时才会调用它。
因此,简而言之,似乎memFile
在应用程序的过程中再创建一次,但应该如何?我怎样才能确保我在dll中只有一个全局变量的实例?