为什么SHGetPathFromIDList函数导出三次

时间:2016-09-05 17:22:45

标签: c winapi dllexport shell32

我知道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被导出了三次:

  • ORDINAL 312 - SHGetPathFromIDList
  • ORDINAL 313 - SHGetPathFromIDListA
  • ORDINAL 314 - SHGetPathFromIDListW

这是什么目的?

1 个答案:

答案 0 :(得分:4)

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

SHGetPathFromIDListASHGetPathFromIDListW是ANSI和Unicode版本。

如果您使用dumpbin或Dependency Walker检查入口点,您会发现SHGetPathFromIDList的入口点与SHGetPathFromIDListA的入口点相同。

现代SDK会链接到SHGetPathFromIDListASHGetPathFromIDListW,但绝不会链接到SHGetPathFromIDList