2017-07-14 45 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

回答