【发布时间】: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 的共享版本时才有效!