dll中的全局变量不一致?

时间:2017-07-14 19:52:05

标签: c++ dll mfc

我正在从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将日志写入内存时,在某个地方,它变得很糟糕,好像新声明的那样(未初始化)。请参阅snapshot文件位置/大小全部重置的位置。

当我在DllMain中设置断点时,更奇怪的是,在case DLL_PROCESS_ATTACH内,它永远不会中断(就像从未调用过),但初始化确实有效! case DLL_PROCESS_DETACH中的断点确实有效,只有在我关闭应用程序时才会调用它。

因此,简而言之,似乎memFile在应用程序的过程中再创建一次,但应该如何?我怎样才能确保我在dll中只有一个全局变量的实例?

1 个答案:

答案 0 :(得分:0)

使用完DLL后,尝试使用FreeLibrary函数。 但是,此方法尚未考虑同时使用。

enter link description here