2016-09-05 9 views
3

shell32.dllは2種類の関数をエクスポートします。— ANSIとUNICODEです。 (簡潔にするために、CHAR */WCHAR *引数を取る関数についてのみ話しています)。SHGetPathFromIDList関数を3回エクスポートする理由

たとえば、ShellMessageBoxAはANSIバージョンです。ShellMessageBoxWはUnicodeバージョンです。

#ifdef UNICODE 
#define ShellMessageBox ShellMessageBoxW 
#else 
#define ShellMessageBox ShellMessageBoxA 
#endif // !UNICODE 

だからShellMessageBoxのShell32.dllからエクスポートされた関数として存在しません:ShellMessageBoxは、ヘッダファイルに定義されたマクロです。 - SHGetPathFromIDList

  • ORDINAL 313からSHGetPathFromIDListA
  • ORDINAL 314からSHGetPathFromIDListW
  • の目的は何である

    • ORDINAL 312:

      しかし、今、私はSHGetPathFromIDListを3回エクスポートされていることを発見しましたこの?

    +0

    ヘッダーファイルを見て、どのように 'SHGetPathFromIDList'を宣言しているのか見ることができます。私の推測では、ヘッダーの宣言は 'ShellMessageBox'とまったく同じです。 'SHGetPathFromIDList'は単なるレガシーなホールドオーバーです。エクスポートされましたが、使用は意図されていません。 –

    答えて

    4

    SHGetPathFromIDListは、もともとユニコードをサポートしていなかったので、AWのエクスポートを持たない古いバージョンのWindowsを対象としたレガシープログラム用です。このエクスポートはANSIバージョンです。

    SHGetPathFromIDListAおよびSHGetPathFromIDListWは、ANSIおよびUnicodeバージョンです。

    エントリポイントをdumpbinまたはDependency Walkerで調べると、SHGetPathFromIDListのエントリポイントがSHGetPathFromIDListAのエントリポイントと同じであることがわかります。

    最新のSDKはSHGetPathFromIDListAまたはSHGetPathFromIDListWにリンクされますが、SHGetPathFromIDListにはリンクされません。

    +0

    このShell32.dll擬似コードが真であると仮定しても安全です。#define SHGetPathFromIDList SHGetPathFromIDListA? – user2120666

    +0

    いいえ、そうではありません。 'UNICODE'が定義されている場合、' SHGetPathFromIDList'は 'SHGetPathFromIDListW'に展開されます。 –

    関連する問題