一个简单的 python 程序无法访问我的 dll

Posted

技术标签:

【中文标题】一个简单的 python 程序无法访问我的 dll【英文标题】:A simple python program not being able to access my dll 【发布时间】:2011-09-12 16:02:56 【问题描述】:

我创建了一个简单的 MFC .dll 文件,我可以通过另一个 MFC 应用程序访问它。我试图使用 Python 3.2.2 做同样的事情,但是在我加载我的库后,它没有检测到我的 dll 中的函数并给出如下错误:

    Traceback (most recent call last):
  File "<interactive input>", line 1, in <module>
  File "C:\Python32\lib\ctypes\__init__.py", line 353, in __getattr__
    func = self.__getitem__(name)
  File "C:\Python32\lib\ctypes\__init__.py", line 358, in __getitem__
    func = self._FuncPtr((name_or_ordinal, self))
AttributeError: function 'SayHello' not found

..

我试图找到一个简单的程序来使用 Python 访问我的 MFC dll 文件,但到目前为止还没有成功。只是为了让大家知道,我已经阅读了ctypes 并且一直在寻找很多东西来让它工作。我的主要目标是使用 Python 作为脚本语言来与我的 MFC C++ dll 交互。我读了很多书,我能读到的最接近的是 PythonWin。请在这方面提供帮助。

干杯。

【问题讨论】:

由于您使用的是 c++,您可能忘记将函数导出为 extern C(或者可能使用一些 def 文件)?如果你没有 c++ 修饰函数名。虽然我假设 ctypes 只允许使用一些特定的调用约定调用 C 函数 - 如果你不只使用 extern C,在 C++ 中似乎有问题。 我无法回答您的具体问题,但您可以查看Cython 而不是使用ctypes——我怀疑它会更容易。跨度> @ Voo:我确实使用了 extern "C" __declspec(dllexport)...但它仍然给我同样的错误,我仍然无法通过 Python 访问我的函数。只是为了让您知道我创建的 dll,请查看此链接:functionx.com/visualc/libraries/staticdll.htm 我不确定为什么在我加载库后默认情况下它没有检测到我的 .dll 函数。我 100% 确定我的库已加载,但还没有真正能够通过我的任何功能。 【参考方案1】:

我已经能够抓住我的问题并解决了它。对于那些将来可能会期待这种情况的人,我只想粘贴 python 脚本代码,以使您的函数可以在您的 python 脚本中访问。使用 C++ 函数的方法显然是在 .dll 文件中声明它。

extern "C" __declspec(dllexport) int SayHello(int strNo);

你的 Python 脚本应该是这样的:(getattr() 函数是在你的 python 脚本中访问你的 c++ 函数所必需的)

mydll = cdll.LoadLibrary("Location.dll")
hellofunc = getattr(mydll,'SayHello')
func2.restype = c_int
func2.argtypes = [c_int]
x = func2(34)
print(x)

...

如果有人认为我可能错了,请随时纠正我。我是 Python 的初学者,它以这种方式为我工作,之后我可以继续编写脚本。 希望这对其他人有帮助。

干杯。

【讨论】:

以上是关于一个简单的 python 程序无法访问我的 dll的主要内容,如果未能解决你的问题,请参考以下文章

安装 msvcr90.dll 的简单方法! (没有 C++ 可再发行包)

使用 python 3.7 PyQt5 和 cx_Freeze 创建可执行文件,但 DLL 无法加载

使用 C++ 从 32 位进程访问 64 位 dll

我的 MFC C++ .dll 的多线程

在 Python 中使用 C++ DLL

WinDbg x64:无法调试故障转储 - 无法加载数据访问 DLL