如何确定特定 win32 api 调用所需的 windows 库?
Posted
技术标签:
【中文标题】如何确定特定 win32 api 调用所需的 windows 库?【英文标题】:How can I determine the windows libraries required for a specific win32 api call? 【发布时间】:2012-02-16 20:40:14 【问题描述】:我正在使用几个 Windows api 模块,如 win32wnet
、win32file
、win32con
等,但只有其中的几个方法。
我正在使用 py2exe (bundle_files==3) 打包我的应用程序,如果它们在其他 Windows 平台上运行,它会很容易出错。
我想: 1) 打包所有必需的并且仅包含适当的库。如果可能的话,我不想依赖操作系统上已经安装的内容。
或者: 2)我想编写清单以将我的应用程序连接到现有 dll 的适当版本。 (如果打包dll不合法)
python在运行时提供的错误是模糊的:
ImportError: DLL load failed: The specified procedure could not be found.
文档(例如:help(win32wnet)
)似乎没有多大用处。
如何确定我的应用需要哪些本机 Windows 库?
【问题讨论】:
你要调用的函数不是 DLL 中的? @Toby Allenwin32wnet.WNetAddConnection2
是其中之一。我有一长串其他人。我想要(ed)一个通用的解决方案来查找这些函数使用的库(我已经找到了一个解决方案 - 请参阅我的答案)
【参考方案1】:
我认为您可能会发现 Microsoft 不允许将核心 Windows dll 作为应用程序的一部分提供。
你应该编写你的软件来使用机器上可用的东西,除非它像 comctrls32 这样有多个版本。
【讨论】:
好点。但它没有回答这个问题。寻找确定.pyd的依赖路径的方法 解决了问题,但没有解决问题。我:“医生,我这样做的时候很痛。”医生:“不要那样做。” @Toby Allen 我知道这些库在机器上可用。但我得到一个 ImportError 因为显然 pywin32 找不到它们,或者正在找到一个不打算由该版本 pywin32 使用的 SxS 版本。【参考方案2】:在 .pyd(在本例中为 win32wnet)上使用 dependency walker 来发现是否有任何 .dll 依赖项被破坏。然后要么 1)在包中包含清单(如果您知道本机库在哪里)或 2)在包中捆绑 .dll(如果 MS 允许)
【讨论】:
即使 MS 允许,您也无法捆绑 DLL。它不起作用。例如,您不能将 vista user32 放在 xp 上。它不起作用。您不需要任何清单来加载基本的 win32 dll。你的实际问题不是你想的那样。 @David Heffernan 那么为什么 py2exe 将 .dll 与一个包捆绑在一起呢? 我认为它捆绑了 Python DLL。也许像 python27.dll 和 C 运行时所需的任何 DLL。还有任何需要的 PYD 等等。它真的不应该捆绑 Windows DLL。那是行不通的。 @DavidHeffernan 但确实如此。例如在这种情况下,py2exe 自动将 mpr.dll 与包捆绑在一起。我的问题是 mpr 也依赖于 c++ 运行时并且找不到它。 (由于 SxS?)一旦我为 mpr.dll 编写了清单,一切似乎又可以正常工作了。 py2exe 不应该那样做。但我不知道为什么会这样。 mpr.dll 不依赖于 C 运行时。它是一个系统组件,它们不依赖于 MSVC 运行时。以上是关于如何确定特定 win32 api 调用所需的 windows 库?的主要内容,如果未能解决你的问题,请参考以下文章
用于获取访问 obiee 目录中特定对象所需的角色/角色的 API