Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何直接从序号12调用SHCreateMemStream()_C_Windows_Winapi - Fatal编程技术网

如何直接从序号12调用SHCreateMemStream()

如何直接从序号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

我正在编写一个仍然需要在Windows XP上运行的应用程序。我想使用
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
       ...