SHGetPathFromIDList函数为什么导出了3次

Why is SHGetPathFromIDList function exported three times

我知道 shell32.dll 导出两种类型的函数——ANSI 和 UNICODE。 (为了简单起见,我只讨论接受 CHAR*/WCHAR* 参数的函数。)

例如ShellMessageBoxA是ANSI版本,而ShellMessageBoxW是Unicode版本。 ShellMessageBox是头文件中定义的宏:

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

因此 ShellMessageBox 作为从 Shell32.dll 导出的函数不存在。

但是现在发现SHGetPathFromIDList导出了3次:

这样做的目的是什么?

SHGetPathFromIDList 适用于最初针对旧版本 Windows 的遗留程序,这些旧版本没有 AW 导出,因为它不支持 Unicode。此导出是 ANSI 版本。

SHGetPathFromIDListASHGetPathFromIDListW 是 ANSI 和 Unicode 版本。

如果您使用 dumpbin 或 Dependency Walker 检查入口点,您将看到 SHGetPathFromIDList 的入口点与 SHGetPathFromIDListA.

的入口点相同

现代 SDK 会 link 到 SHGetPathFromIDListASHGetPathFromIDListW,但永远不会 SHGetPathFromIDList