【问题标题】:How do I find which Dlls contain specific W32 functions?如何找到哪些 Dll 包含特定的 W32 函数?
【发布时间】:2014-02-04 23:29:15
【问题描述】:

我的应用程序是一个 WPF 应用程序,它已经包含用于旧类型系统 DPI 感知的代码,该代码在除 8.1 之外的所有 Windows 版本中都能正常工作。事实证明,微软在 Windows 8.1 中添加了许多功能,作为他们实现每显示器 DPI 感知的一部分。我需要在我的程序中实现代码来支持这种类型的 DPI 感知。

我的文档列出了每个显示器的 DPI 感知功能及其参数。我需要将它们导入 C# 并从我的窗口类中调用它们。但我不知道哪些 DLL 包含这些函数!例如,GetProcessDpiAwareness 函数的文档并没有指出它在哪个 DLL 中。

如何找到 DLL 中的导出内容?

【问题讨论】:

  • 您确定您的代码有问题吗?它可能是你的虚拟机。你在 VMWare 中看到这个问题了吗?我有一个 WPF 窗口,如果有多个监视器,我会缩放并放置在一个非常特定的位置。在使用 VMWare 时,我发现此窗口的位置存在问题,但无法在实际的 Windows 8.1 计算机或 Parallels VM 上重现。
  • 您似乎在他们的文档中发现了一个错误,它缺少告诉您要查看哪个 DLL 的标准“要求”页脚。此外,如果您转到 to the parent page,则 @ 的文本987654325@ 不像其他链接一样是可点击的链接。
  • Martin:我没有运行 VMWWare。不是这样的。
  • @ScottChamberlain:过去几天我一直在使用 Windows 8.1 Geolocation API,我认为 GetProcessDpiAwareness 文档缺少“要求”页脚的原因是因为 这是一个 Windows 8.1 API。我看过的所有 Windows 8.1 API 似乎都缺少该页脚。在 VS 2013 中,您会自动获得对所有 .NET Framework 和 Windows 函数的引用。你也可以在 VS 2012 中做到这一点。见stackoverflow.com/questions/22227263/…
  • MSDN 在线文档现在似乎也包含了函数的头文件名和库名。例如,对于 GetProcessDpiAwareness(),请参阅 msdn.microsoft.com/en-us/library/windows/desktop/dn302059.aspx

标签: c# winapi dll


【解决方案1】:

一个愚蠢的方法:在C:\Windows\System32 中对GetProcessDpiAwareness 进行二分搜索,然后使用Dependency Walker 研究每个出现的情况以进行导出。

这会产生结果:GetProcessDpiAwarenessSHCore.dll 导出。

人们也可以搜索 Windows SDK 标头和库,但令我惊讶的是,我没有找到 GetProcessDpiAwareness

另一个想法,从命令行提示符运行以下命令:

for %f in (%windir%\system32\*.dll) do dumpbin.exe /exports %f >>%temp%\__exports

然后在%temp%\__exports 中搜索 API。

【讨论】:

  • 在 Windows SDK 中搜索 .h 文件是我发现的最简单的方法。只需获取一个好的全文 sercher 并在 sdk 文件夹的 Include 子文件夹中搜索 *.h
  • 我找到了它,但它并没有我想象的那么有用,C:\Program Files (x86)\Windows Kits\8.1\Include\um\ShellScalingApi.h 并没有真正说明要查看什么 DLL。但正如您发现的那样,它是 SHCore.dll,如果你看看网站上的其他函数,它们也列出了他们都说SHCore.dll的DLL。
  • @ScottChamberlain,您能否在 SDK 的 Lib 文件夹中进行二分查找?
  • 正确,搜索 C:\Program Files (x86)\Windows Kits\8.1\Lib 会出现 \winv6.3\um\arm\shcore.lib\winv6.3\um\x64\shcore.lib\winv6.3\um\x86\shcore.lib(我使用 Agent Ransack 进行全文搜索,它将同时搜索文本和二进制文件字符串。)
  • 谢谢你,Noseratio 和 Scott Chamberlain。
【解决方案2】:

我知道之前有人问过这个问题。 (每次google都会出现这个问题。所以分享一下我的方法。)

如果有人想在 DLL 中搜索函数,this tool 可以帮您完成。对于我的 Windows 10(64 位)上的 GetProcessDpiAwareness,它是从 shcore.dll 导出的,就像上面已经提到的那样。截图如下:


虽然我需要先说它总是谨慎地引用函数的documentation on MSDN。目前您可以在每个页面的底部找到它:

如果您使用我上面显示的搜索,您会注意到许多系统函数是从多个 DLL 导出的(其中一些没有记录。)因此,如果您只是盲目地使用您在搜索中找到的任何内容应用程序,如果 Microsoft 更改其中一个未记录的功能,您将来可能会面临破坏程序的风险。因此,仅将其用于您自己的研究或好奇心。

【讨论】:

    【解决方案3】:

    通常使用相同资源的函数位于相同的 dll 中。查看另一个 dpi 函数,例如 GetDpiForMonitor,您会看到它在 Shcore.dll 中

    编辑:以这种方式找到 dll 后,您可以使用依赖项遍历器仔细检查以查看从该 dll 导出的函数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-15
      • 1970-01-01
      • 1970-01-01
      • 2012-08-09
      • 1970-01-01
      • 2011-07-08
      相关资源
      最近更新 更多