0
我正在從dll創建(臨時)日誌文件。但我所定義的全局變量似乎不一致。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
}
問題是,當我使用memFile在DLL中寫記錄到內存中,在道路上的某個地方,它變得糟糕,因爲如果新聲明(未初始化)。請參閱文件位置/大小全部重置。
當我在DllMain中設置斷點時,什麼讓事情變得更奇怪,在case DLL_PROCESS_ATTACH
之內,它永遠不會在那裏崩潰(像從未調用過),但初始化確實有效! case DLL_PROCESS_DETACH
中的斷點確實有效,並且僅在關閉應用程序時才被調用。
因此,簡而言之,memFile
似乎在應用程序的過程中又被創建了,但它應該嗎?我如何確保在DLL中只有一個全局變量的實例?
在close方法或析構函數上使用斷點。你有MFC的來源。我希望你意識到,只有當你使用共享的MFC版本時才能使用它! – xMRi