从 Python 调用自定义的 C++ dll

Posted

技术标签:

【中文标题】从 Python 调用自定义的 C++ dll【英文标题】:Calling customized C++ dll from Python 【发布时间】:2013-09-11 16:02:26 【问题描述】:

我的 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 位的。

我可以知道我错了吗?

提前非常感谢。 :)

【问题讨论】:

你考虑过使用 IronPython 吗? @Inspector 怎么样?如何从 IronPython 链接到本机 DLL? import clr; clr.AddReference(…) @inspectorG4dget:如果本机代码的位数不匹配,使用IronPython不会解决问题 @Inspector clr.AddReference 用于托管 DLL。这个是原生的。 【参考方案1】:

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

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

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

【讨论】:

这是问题的正确答案。您能否通过添加 OP 如何使用dumpbin \headers 确定 dll 和 Python 安装的位数并查找 machine 的条目来放大? @Abhijit 我不会这样做。提问者正在编译 DLL,因此只需要在 IDE 中检查目标平台。无需逆向工程。 可能是,但如果有疑问,我首先检查是否存在位不匹配。这在使用第三方 dll 时很有帮助。无论如何,我已经添加了自己的答案 这可能会有所帮助:64-bit C++ Development Under Visual Studio 2012 Express @DavidHeffernan 嗨,大卫,感谢您的回答。我的目标是 Win 64 平台。我的计划是编写一系列 C++ .dll 并从 Python 调用它们。【参考方案2】:

我在 google 上搜索过这个错误信息,有些帖子说是因为 32 位和 64 位之间的兼容性。但我对此表示怀疑,因为我的 IDE 和系统都是 64 位的。

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

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

这并不能保证您会构建 64 位二进制文​​件。事实上,VS 2012 IDE 是一个 32 位应用程序。它的编译器和负责生成 64 位二进制文​​件的 CRT。而且 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)

【讨论】:

我尝试在配置管理器中将 VS2012 更改为 Win32,但是仍然出现同样的错误。【参考方案3】:

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

我测试了它,实际上效果很好

【讨论】:

以上是关于从 Python 调用自定义的 C++ dll的主要内容,如果未能解决你的问题,请参考以下文章

从python调用c++函数

在 C# 和非托管 C++ 之间传递自定义对象

在使用 Visual Studio 2017 和 boost 构建的 python 中加载自定义 dll 时出现依赖错误

自定义内存池(C++需要掌握)

从 python 调试 VS2010 中的 c++ dll

我想在dll的类里面 添加一个自定义的初始化函数,不知道怎么弄?