【问题标题】:How to call SHCreateMemStream() directly from ordinal 12如何直接从序号 12 调用 SHCreateMemStream()
【发布时间】:2020-11-02 18:24:25
【问题描述】:

我正在编写一个仍需要在 Windows XP 上运行的应用程序。我想使用SHCreateMemStream()。 MSDN 是这样说的:

在 Windows Vista 之前,此功能未公开包含 Shlwapi.h 文件,也不是从 Shlwapi.dll 中按名称导出的。使用 在早期系统上,您必须直接从 Shlwapi.dll 调用它 文件为序数 12 (source)

但是我该怎么做呢?由于 MSDN 说 SHCreateMemStream() 不是在 Shlwapi.dll 中按名称导出的,我想我不能只使用 LoadLibrary()GetProcAddress() 在 XP 上获取指向它的函数指针。那么我应该如何在 XP 上调用这个函数呢?

请注意,我正在寻找纯 C 语言的解决方案,而不是 C++。

【问题讨论】:

  • this 有帮助吗?
  • 简单地与 Shlwapi.lib 链接 - 无论如何 SHCreateMemStream 由序号 12 导入
  • "我想我不能只使用 LoadLibrary()GetProcAddress() 在 XP 上获取指向它的函数指针" - 是的,你可以。 GetProcAddress() 可以按名称或序数查找函数。
  • @RemyLebeau:谢谢,我不知道。但事实证明,Windows 7 SDK 附带的链接库也导入了序数(正如 RbMm 在他的回答中指出的那样)。所以我的 OP 中引用的 MSDN 中的注释可能是非常旧的 SDK 的遗物,因为在 Windows 7 SDK 中,SHCreateMemStream() 确实没有什么特别的事情要做。

标签: c windows winapi


【解决方案1】:

xp 不需要什么特别的东西。像往常一样与 Shlwapi.lib 链接并调用 SHCreateMemStream 作为任何导入的 api。所有 Shlwapi.lib from ms sdk import SHCreateMemStream by ordinal 12 但不是按名称(这可以通过运行检查

link.exe /dump /exports <path>shlwapi.lib > shlwapi.txt

如果一切正常,你必须在 shlwapi.txt 里面查看(当然你可以为输出文件选择任何名称)

Dump of file <path>shlwapi.lib

File Type: LIBRARY

     Exports

       ordinal    name

       ...

            12    _SHCreateMemStream@8
       ...

in 输出将是此 lib 导入的函数列表。在某些名称之前打印序数 - 这意味着此函数由序数导入。无序 - 按名称导入的函数。 SHCreateMemStream 由序号 12 导入。因此,如果您与此类库链接 - 您的 PE 将按序号 12 导入 SHCreateMemStream,而不是按名称导入。这是你需要的。

【讨论】:

  • 你是对的,它有效。使用 Windows 7 SDK 在 Windows 7 上编译,在 XP 上运行良好。谢谢!
猜你喜欢
  • 1970-01-01
  • 2014-04-08
  • 1970-01-01
  • 1970-01-01
  • 2011-07-15
  • 2023-01-19
  • 2022-01-21
  • 2012-09-24
  • 1970-01-01
相关资源
最近更新 更多