如何直接从序号12调用SHCreateMemStream()
我正在编写一个仍然需要在Windows XP上运行的应用程序。我想使用如何直接从序号12调用SHCreateMemStream(),c,windows,winapi,C,Windows,Winapi,我正在编写一个仍然需要在Windows XP上运行的应用程序。我想使用SHCreateMemStream()。MSDN说: 在Windows Vista之前,此功能未包含在公用程序中 Shlwapi.h文件,也不是从Shlwapi.dll按名称导出的。使用 在早期的系统上,必须直接从Shlwapi.dll调用它 文件顺序为12 () 但是我该怎么做呢?既然MSDN说SHCreateMemStream()在Shlwapi.dll中没有按名称导出,我想我不能只使用LoadLibrary()和GetP
SHCreateMemStream()
。MSDN说:
在Windows Vista之前,此功能未包含在公用程序中
Shlwapi.h文件,也不是从Shlwapi.dll按名称导出的。使用
在早期的系统上,必须直接从Shlwapi.dll调用它
文件顺序为12
()
但是我该怎么做呢?既然MSDN说SHCreateMemStream()
在Shlwapi.dll
中没有按名称导出,我想我不能只使用LoadLibrary()
和GetProcAddress()
在XP上获取指向它的函数指针。那么我应该如何在XP上调用这个函数呢
注意,我在C中寻找一个解决方案,而不是C++。
不需要XP的特殊。像往常一样链接到Shlwapi.lib,并像任何导入的api一样调用SHCreateMemStream。ms sdk中的所有Shlwapi.lib按序号12导入SHCreateMemStream,但不按名称导入(这可以通过运行进行检查)link.exe /dump /exports <path>shlwapi.lib > shlwapi.txt
link.exe/dump/exports shlwapi.lib>shlwapi.txt
如果一切正常,您必须在shlwapi.txt内查看(当然,您可以为输出文件选择任何名称)
文件shlwapi.lib的转储
文件类型:库
出口
序名
...
12 _SHCreateMemStream@8
...
在输出中将是此库导入的函数列表。在某些名称之前按序号打印-这意味着此函数按序号导入。在无序号中-函数按名称导入。SHCreateMemStream按序号12导入。因此,如果您链接到此类库,您的PE将按序号12导入SHCreateMstream,但不按名称导入。这是您和需要。有帮助吗?只需链接Shlwapi.lib-这里是由序号12导入的SHCreateMemStream“我想我不能只使用
LoadLibrary()
和GetProcAddress()
在XP上获取指向它的函数指针”-是的,你可以。GetProcAddress()
可以按名称或序号查找函数。@RemyLebeau:谢谢,我不知道。但事实证明,Windows 7 SDK附带的链接库也会导入序号(正如RbMm在回答中指出的)。因此,我的作品中引用的MSDN中的注释可能是非常古老的SDK的遗物,因为在Windows 7 SDK中,对于shCreateMestream()
,实际上没有什么特殊的操作。没错,它可以工作。在Windows 7上使用Windows 7 SDK编译,在XP上工作正常。谢谢!
Dump of file <path>shlwapi.lib
File Type: LIBRARY
Exports
ordinal name
...
12 _SHCreateMemStream@8
...