0

いくつかの外部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を返すため、これは機能しません。誰かがこれを手伝ってくれる?

4

1 に答える 1

1

AfxenableMemoryLeakDump名前ではなく、序数値でエクスポートされます。これは、 で[NONAME]示されるマーカーでわかりますdumpbin。ここに私が得るものがあります:

C:\Windows\System32>dumpbin /exports mfc100d.dll | grep AfxEnableMemoryLeakDump
      15902      003A20D0 [NONAME] ?AfxEnableMemoryLeakDump@@YGHH@Z (int __stdcall AfxEnableMemoryLeakDump(int))

最初の値15902は序数値です。ドキュメントでは次のようにGetProcAddress説明されています。

lpProcName [in] 関数または変数の名前、または関数の序数値。このパラメーターが序数の値である場合は、下位ワードにある必要があります。上位ワードはゼロでなければなりません。

だから試してみてください

const WORD AfxEnableMemoryLeakDumpOrdinal = 15902;
GetProcAddress( GetModuleHandle( ... ), (LPCSTR)AfxEnableMemoryLeakDumpOrdinal );
于 2012-07-10T11:58:27.877 に答える