在Windows 10的 Python 3.12中加载32位 DLL
我正在尝试加载一个32位的C 动态链接库,在Windows 7下使用Python 2.7的 32位版本时很简单:
driver = ctypes.cdll.LoadLibrary("VBridge.dll")
driver.Connect()

我和 msl-loadlib 的模块开发者有一个讨论串,我们正在寻找功能等价的3.10版代码。
加载的附加DLL与主DLL位于同一目录。厂商的测试应用程序也在同一目录下,使用相同的库就能正常运行。额外的复杂性在于Python 3.10是 64位的,但即使是 [msl-loadlib] 的交互式32位 Py3.13服务器控制台:
python -c "from msl.loadlib import Server32; Server32.interactive_console()"
无法找到依赖项 FileNotFoundError: Could not find module 'VBridge.dll' (or one of its dependencies). Try using the full path with constructor syntax. 。 msl服务器
我又读到一些关于 >=3.8路径搜索变更的讨论 文件未找到错误:无法找到模块 'libvlc.dll';我猜想VLC的 DLL与绑定的问题在那里也和我的驱动处于同一阵营。
我尝试了 os.add_dll_directory(os.getcwd())、ctypes.windll.AddDllDirectory(dll_directory) 和 LOAD_WITH_ALTERED_SEARCH_PATH
解决方案
CristiFati 的帖子和 msl-loadlib 的讨论给出了解决方案和示例。
要点摘要:在Windows 10/11的 64位环境下加载旧的32位 DLL时,msl-loadlib会启动一个IPC服务器进程,使用它自带的32位 Python 3.13,64位客户端的函数就可以调用。
对我来说关键是在Windows 10上,那个用MSVC 2008编译的旧DLL要求我把32位 Python的 server32-windows.exe 设置为Win7兼容性模式,才能与旧DLL正确通信。然后一切就都能正常工作。