3

shell32.dll は、ANSI と UNICODE の 2 種類の関数をエクスポートすることを知っています。(わかりやすくするために、CHAR*/WCHAR* 引数を取る関数についてのみ説明します。)

たとえば、ShellMessageBoxAは ANSI バージョンで、ShellMessageBoxWは Unicode バージョンです。ShellMessageBoxヘッダー ファイルで定義されているマクロです。

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

したがってShellMessageBox、Shell32.dll からエクスポートされる関数としては存在しません。

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

  • オーディナル 312 -SHGetPathFromIDList
  • オーディナル 313 -SHGetPathFromIDListA
  • オーディナル 314 -SHGetPathFromIDListW

これの目的は何ですか?

4

1 に答える 1

4

SHGetPathFromIDListUnicode をサポートしていなかったため、Aとのエクスポートがなかった古いバージョンの Windows を最初に対象としたレガシー プログラム用です。Wこのエクスポートは ANSI バージョンです。

SHGetPathFromIDListAおよびSHGetPathFromIDListWANSI および Unicode バージョンです。

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

最新の SDK は、 または のいずれSHGetPathFromIDListAかにリンクしますが、 にはリンクしSHGetPathFromIDListWませんSHGetPathFromIDList

于 2016-09-05T18:00:30.560 に答える