我们有一个 Visual Studio Unicode 应用程序,我们在其中使用一些外部 dll。在这个应用程序中加载了 mfc100ud.dll(注意 u,它代表 Unicode)。该应用程序还使用一些与 mfc100d.dll 链接的外部 dll(因此没有 Unicode)。
在我们的应用程序中,我想通过调用 AfxEnableMemoryLeakDump(FALSE) 来禁用作为 Afx 一部分的内存泄漏转储。当我调用这个函数时,我最终进入了 mfc100ud.dll,因为我们直接与这个 dll 链接。然而,稍后外部 dll 被加载,因此 mfc100d.dll 也被加载。当应用程序关闭时,mfc100d.dll 被卸载,并且由于没有为此 dll 调用 AfxEnableMemoryLeakDump,我们的 MemoryLeakDump 仍然发生。
为了解决这个问题,我尝试通过执行以下操作显式调用 dll 中的函数:
PGNSI pGNSI = (PGNSI) GetProcAddress(GetModuleHandle(TEXT("mfc100d.dll")),
"?AfxEnableMemoryLeakDump@@YGHH@Z"); // 64-bit
if (pGNSI!=nullptr)
{
pGNSI(FALSE);
}
pGNSI = (PGNSI) GetProcAddress(GetModuleHandle(TEXT("mfc100d.dll")),
"?AfxEnableMemoryLeakDump@@YAHH@Z"); // 32-bit
if (pGNSI!=nullptr)
{
pGNSI(FALSE);
}
我使用 dumpbin.exe 来查找修饰的函数名称。
但这不起作用,因为 GetProcAddress 为 32 位和 64 位返回一个 nullptr。有人可以帮忙吗?