2017-07-14 80 views
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中寫記錄到內存中,在道路上的某個地方,它變得糟糕,因爲如果新聲明(未初始化)。請參閱snapshot文件位置/大小全部重置。

當我在DllMain中設置斷點時,什麼讓事情變得更奇怪,在case DLL_PROCESS_ATTACH之內,它永遠不會在那裏崩潰(像從未調用過),但初始化確實有效! case DLL_PROCESS_DETACH中的斷點確實有效,並且僅在關閉應用程序時才被調用。

因此,簡而言之,memFile似乎在應用程序的過程中又被創建了,但它應該嗎?我如何確保在DLL中只有一個全局變量的實例?

+0

在close方法或析構函數上使用斷點。你有MFC的來源。我希望你意識到,只有當你使用共享的MFC版本時才能使用它! – xMRi

回答