【问题标题】:How to use win32api (or similar) on 64-bit components?如何在 64 位组件上使用 win32api(或类似的)?
【发布时间】:2020-06-12 20:22:21
【问题描述】:

我将简要解释一下代码。我想在特定的二进制文件 (exe) 中添加一些 .dll 的内容。当我需要它时,我将从这个二进制文件中删除 dll。这个过程在 CI/CD 过程中会表现得更好。 以下代码完美适用于 32 位 python 解释器和 32 位二进制文​​件。

问题报告: 即使使用 64 位解释器,我也无法对 64 位二进制文​​件执行此过程。 使用 64 位解释器,我无法加载 32 位或 64 位二进制文​​件。问题是是否有一种方法或类似 win32api 的库,比如“win64api”?

尝试的结果总是:

pywintypes.error: (193, 'LoadLibrary', '% 1 is not a valid Win32 application.')

我的问题: 是否有任何表单/模块/库可以对 64 位文件执行此任务?

环境和示例二进制文件:

完美运行:

不起作用:

当地规范

  • platform.platform() >> 'Windows-10-10.0.18362-SP0'

  • platform.uname() >> uname_result(system='Windows', 节点='DESKTOP-SER206K',发布='10',版本='10.0.18362', machine='AMD64', processor='AMD64 Family 21 Model 2 Stepping 0, 正品AMD')

示例代码

import os
import win32api
import win32con
import base64

binary = "C:\\Users\\Guto\\Documents\\python\\python-3.7.7.exe"
assert os.path.exists(binary)
PATH_RC = "C:\\Users\\Guto\\Documents\\python\\sqlite3.dll"
assert os.path.exists(PATH_RC)

# Get a handle that can be used by the UpdateResource()
h = win32api.BeginUpdateResource(binary, 0)
rc_content = open(PATH_RC, "rb").read()
rc_content_b64 = base64.b64encode(rc_content)
win32api.UpdateResource(h, win32con.RT_STRING, "rc_content_b64", rc_content_b64)
# End the update resource of the handle.
win32api.EndUpdateResource(h, 0)

#at this point, I have a modified binary
#then I will access that information

h = win32api.LoadLibrary(binary)
r_list = win32api.EnumResourceNames(h, win32con.RT_STRING)
#Find and Load a resource component
resource = win32api.LoadResource(h, win32con.RT_STRING, "rc_content_b64")

new_rc_content = base64.b64decode(resource)
#Write the DLL again
NEW_PATH_RC = "C:\\Users\\Guto\\Documents\\python\\new_dll.dll"
with open(NEW_PATH_RC, "wb") as f:
    f.write(new_rc_content)

【问题讨论】:

  • @IInspectable thx,我更新了问题报告!
  • 我仍然不确定我是否完全理解你想要完成的事情。当我读到它时,您有一个二进制 (.exe) 文件,并希望将一个库 (.dll) 作为二进制资源嵌入其中,最终将在稍后阶段解压缩。对吗?
  • @IInspectable 是的,就是这样!
  • @mar 我不熟悉 Python。如果你是,请随时将我的评论音译成答案。

标签: python winapi pywin32 win32com


【解决方案1】:

64 位进程根本无法加载 32 位 DLL,它只是 不会工作。当然,64 位窗口仍然可以运行 32 位可执行文件,并且可以加载 32 位 DLL 文件。

【讨论】:

  • 除非您弄错了,否则无法使用 python 64 解释器加载 32x 或 64x 二进制文件。我相信 win32api(顾名思义)仅适用于 32 位。问题是是否有办法在 64 位中使用它?顺便说一句:64 位解释器的 32 位或 64 位二进制文​​件的结果总是这样:pywintypes.error: (193, 'LoadLibrary', '%1 is not a valid Win32 application.')
  • @GutoG "win32" 是通用 Windows API 的名称,无论您是从 32 位还是 64 位程序调用它。也许微软将 32 放在名称中是一个错误,但他们试图将其与之前的 16 位 API 区分开来。这个答案是正确的,你不能在同一个任务空间中混合 32 位和 64 位代码——错误信息可能有点误导。
  • @Mark Ransom 我理解,但我无法使用 python x64 解释器加载 32 位二进制文​​件!无论如何,非常感谢大家。
  • 这并不完全正确。任何位数的进程都可以加载任何位数的二进制文件,只要它不让 OS 加载程序参与准备执行。 LoadLibraryEx 可以将二进制文件加载为数据文件。这大概是 OP 试图将二进制文件嵌入到可执行映像的资源部分中所做的事情。
猜你喜欢
  • 2011-02-10
  • 2011-11-09
  • 2021-07-26
  • 2011-12-17
  • 2012-05-19
  • 1970-01-01
  • 1970-01-01
  • 2013-11-18
  • 1970-01-01
相关资源
最近更新 更多