いくつかの外部dllを使用するVisualStudioUnicodeアプリケーションがあります。このアプリケーションでは、mfc100ud.dllがロードされます(Unicodeを表すuに注意してください)。アプリケーションは、mfc100d.dllにリンクされているいくつかの外部dllも使用します(したがって、Unicodeは使用しません)。
このアプリケーションでは、AfxEnableMemoryLeakDump(FALSE)を呼び出して、Afxの一部であるメモリリークダンプを無効にします。この関数を呼び出すと、このdllと直接リンクしているため、mfc100ud.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を返すため、これは機能しません。誰かがこれを手伝ってくれる?