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中的全局变量不一致?的主要内容,如果未能解决你的问题,请参考以下文章