dll中的全局变量不一致?

Posted

技术标签:

【中文标题】dll中的全局变量不一致?【英文标题】:global variable in dll inconsistent? 【发布时间】: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 的共享版本时才有效! 【参考方案1】:

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

enter link description here

【讨论】:

以上是关于dll中的全局变量不一致?的主要内容,如果未能解决你的问题,请参考以下文章

是共享库/dll中的全局变量,跨进程共享

全局外部指针变量在 DLL 中不可见

如何从 C# 中的 C++ dll 中的全局变量从函数中获取返回数组?

调试实战 —— dll 加载失败之全局变量初始化篇

调试实战 —— dll 加载失败之全局变量初始化篇

可以从 Windows DLL 中的全局变量创建/销毁 std::threads 吗?