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次:
- 序数 312 -
SHGetPathFromIDList
- 序数 313 -
SHGetPathFromIDListA
- 序数 314 -
SHGetPathFromIDListW
这样做的目的是什么?
SHGetPathFromIDList
适用于最初针对旧版本 Windows 的遗留程序,这些旧版本没有 A
和 W
导出,因为它不支持 Unicode。此导出是 ANSI 版本。
SHGetPathFromIDListA
和 SHGetPathFromIDListW
是 ANSI 和 Unicode 版本。
如果您使用 dumpbin
或 Dependency Walker 检查入口点,您将看到 SHGetPathFromIDList
的入口点与 SHGetPathFromIDListA
.
的入口点相同
现代 SDK 会 link 到 SHGetPathFromIDListA
或 SHGetPathFromIDListW
,但永远不会 SHGetPathFromIDList
。
我知道 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次:
- 序数 312 -
SHGetPathFromIDList
- 序数 313 -
SHGetPathFromIDListA
- 序数 314 -
SHGetPathFromIDListW
这样做的目的是什么?
SHGetPathFromIDList
适用于最初针对旧版本 Windows 的遗留程序,这些旧版本没有 A
和 W
导出,因为它不支持 Unicode。此导出是 ANSI 版本。
SHGetPathFromIDListA
和 SHGetPathFromIDListW
是 ANSI 和 Unicode 版本。
如果您使用 dumpbin
或 Dependency Walker 检查入口点,您将看到 SHGetPathFromIDList
的入口点与 SHGetPathFromIDListA
.
现代 SDK 会 link 到 SHGetPathFromIDListA
或 SHGetPathFromIDListW
,但永远不会 SHGetPathFromIDList
。