从Python调用自定义C ++ DLL

时间:2013-09-11 16:02:26

标签: c++ python windows ctypes

我的C ++ IDE是Visual Studio 2012 Express版本,我的Python IDE是Aptana3(64位)。我的电脑是Windows 7 64位。

我用C ++(Win32控制台应用程序)编写.dll,它基本上遵循MSDN的指令。当我用C ++应用程序调用它时,它运行良好。

然后我尝试通过以下代码从Python调用它:

import ctypes

d = ctypes.WinDLL("C:\\DynamicLibrary\\Debug\\MathFuncsDll.dll")

但是,我有以下错误:

File "`<pyshell#8>`", line 1, in <module>
d = ctypes.WinDLL("C:\\DynamicLibrary\\Debug\\MathFuncsDll.dll")
  File "C:\Python27\lib\ctypes\__init__.py", line 365, in __init__
    self._handle = _dlopen(self._name, mode)
WindowsError: [Error 193] %1 is not a valid Win32 application

我已经用Google搜索了这条错误消息,有些帖子说它是因为32位和64位之间的兼容性。但我对此表示怀疑,因为我的IDE和系统都是64位的。

我可以知道我错了吗?

非常感谢提前。 :)

3 个答案:

答案 0 :(得分:3)

该错误的最常见解释是系统正在尝试将32位DLL加载到64位进程中,反之亦然。您的系统只有64位的事实使得诊断更有可能。也许你的Python是64位,但C ++项目输出一个32位的DLL。反之亦然。

在问题中,您声明您的Python安装是64位。在这种情况下,您需要查看您的C ++项目。你的目标是什么平台? Win32还是x64?我的钱就在于你的目标是Win32。

这是最可能的解释。除此之外,下一个最可能的原因是完全相同的问题,但对于其中一个依赖项。 Python进程和DLL匹配,但在解析DLL的依赖关系时,加载器会找到错误位的DLL。

答案 1 :(得分:0)

  

我已经搜索过此错误消息,有些帖子说是因为   32位和64位之间的兼容性。但我怀疑,因为我的   IDE和系统都是64位。

是的,你的研究是正确的。

  

我的C ++ IDE是Visual Studio 2012 Express版本,   我的电脑是Windows 7 64位。

这并不保证您将构建64位二进制文​​件。事实上,VS 2012 IDE是一个32位应用程序。它的编译器和CRT负责生成64位二进制文​​件。此外,Visual Studio的默认设置是生成32位二进制文​​件

您可以轻松google并确定如何使用Visual Studio构建64位二进制文​​件。或者,请参阅链接How to: Configure Visual C++ Projects to Target 64-Bit Platforms

  

我的Python IDE是   Aptana3(64位)。我的电脑是Windows 7 64位。

这仍然没有说明你的Python安装的一致性。

如有疑问,请检查dllpython.exe的位数。您可以使用dumpbin

轻松确定位数
C:\Python27>dumpbin /headers python.exe|grep "machine"
             14C machine (x86)

答案 2 :(得分:0)

将您的C代码构建为X64版本

我测试了它并且实际上运行良好