0
我正在从dll创建(临时)日志文件。但我所定义的全局变量似乎不一致。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
}
问题是,当我使用memFile在DLL中写记录到内存中,在道路上的某个地方,它变得糟糕,因为如果新声明(未初始化)。请参阅文件位置/大小全部重置。
当我在DllMain中设置断点时,什么让事情变得更奇怪,在case DLL_PROCESS_ATTACH
之内,它永远不会在那里崩溃(像从未调用过),但初始化确实有效! case DLL_PROCESS_DETACH
中的断点确实有效,并且仅在关闭应用程序时才被调用。
因此,简而言之,memFile
似乎在应用程序的过程中又被创建了,但它应该吗?我如何确保在DLL中只有一个全局变量的实例?
在close方法或析构函数上使用断点。你有MFC的来源。我希望你意识到,只有当你使用共享的MFC版本时才能使用它! – xMRi