【问题标题】:global variable in dll inconsistent?dll中的全局变量不一致?
【发布时间】:2017-07-14 19:52:04
【问题描述】:

我正在从 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 中只有一个全局变量实例?

【问题讨论】:

  • 在关闭方法或析构函数上使用断点。您有 MFC 的来源。我希望您知道这仅在您使用 MFC 的共享版本时才有效!

标签: c++ dll mfc


【解决方案1】:

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

enter link description here

【讨论】:

    猜你喜欢
    • 2015-11-03
    • 2012-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多