Ctypes抛出“WindowsError:[错误193]%1不是有效的Win32应用程序”,但它不是32/64位问题

问题描述 投票:2回答:1

我在Ctypes中加载Windows DLL时遇到问题,这会引发错误:

WindowsError: [Error 193] %1 is not a valid Win32 application

就我而言,它是在Windows 7 64位上使用VS2012构建的32位DLL,在我的开发机器上我可以加载它。我使用dumpbin /headers检查它是32位:

FILE HEADER VALUES
         14C machine (x86)

当我尝试在生产VM(也是Windows 7 64位)上通过Ctypes加载相同的DLL时,会出现此问题。我在做的是:

from ctypes import *
self.dll = CDLL(dllabspath)

我明白了:

File "C:\Users\user\Desktop\WinPython-32bit-2.7.10.1\.....\__init__.py", line 365, in __init__
self._handle = _dlopen(self._name, mode)
WindowsError: [Error 193] %1 is not a valid Win32 application

从其他问题我已经尝试了几件事。

  • Thisthisthisthis问题表明我的环境必须相同,即32位Python,32位DLL。这是我的开发系统和我正在测试的VM的情况。在两者上,我使用的是WinPython 32位最新版本。它适用于开发机器,它在VM上失败。
  • Here,它与g ++和旧的Visual Studio运行时相关。我用VS2012编译了一切,所以我认为这不适用于此。对需要MSVCR80.dll的第三方库有一个延迟加载的依赖,但它是延迟加载的,从未调用过。
  • 我还在目标机器上安装了Visual C ++ 32位运行时。
  • This建议DLL需要导出一个C接口,它就是这样做的。
  • 我知道DLL的文件路径/文件名是正确的,和以前一样,存在丢失DLL依赖项的问题,我得到了一个Windows弹出窗口。现在已经不见了。

该错误非常通用,相当神秘。既然它在同一个Python环境中的dev机器上运行,我假设它与一些Visual Studio安装可以给我的依赖关系有关吗?

我该如何正确排除故障?

python c++ visual-studio-2012 dll ctypes
1个回答
0
投票

@eryksun评论道:

cdbwindbg等调试器下运行。在致电windll.kernel32.DebugBreak()之前打电话给CDLL(dllabspath)。在kernelbase!LoadLibraryExW上设置断点并通过g恢复线程。当它重新进入调试器时,输入pt以执行函数返回。然后输入!teb以检查线程的LastStatusValue。此NT状态值可能更有帮助。

进一步:

如果您希望尽可能保持系统清洁,请尝试以下方法:windll.kernelbase.LoadLibraryExW(c_wchar_p(dllabspath), None, 0); status = windll.ntdll.RtlGetLastNtStatus().

否则,它需要从SDK安装调试工具。可以通过设置环境变量_NT_SYMBOL_PATH=symsrv*symsrv.dll*C:\Symbols*http://msdl.microsoft.com/download/symbols按需从Microsoft的符号服务器下载符号,C:\Symbols缓存ERROR_BAD_EXE_FORMAT中的符号

调试时,这可能会有所帮助:

有几个状态代码产生Win32错误STATUS_INVALID_IMAGE_FORMAT(193)。在你的情况下,它是0xC000007Bdu poi(@esp+4))。可能在生产VM中,它尝试加载的依赖DLL之一是64位。在断点处输入kc以打印第一个参数,这是它试图加载的DLL的unicode路径。还可以通过qazxswpoi检查堆栈跟踪。

使用此提示,我发现了对64位WinPCAP DLL的依赖。使用DependencyWalker查看所有内容,它在两台机器上看起来都一样,抱怨64位依赖,但显然在新机器上,DLL加载路径不同,它永远找不到32位版本。

© www.soinside.com 2019 - 2024. All rights reserved.