在cthon中使用python中的dll函数| python 2.7 vs. 3.6

时间:2018-04-06 10:37:29

标签: python dll ctypes

我有一个带有一些函数的C ++ - Library(example.dll),并希望从Python中使用它们。我使用ctypes和Python 2.7,但没有使用Python 3.6。

这里摘自example.h:

extern "C" __declspec(dllexport) LONG _stdcall func1(LPTSTR filename, long cbAddress);

该函数正在解析txt文件,将一些数据加载到内存中并返回此数据的句柄。

我的Python 2.7代码是:

from ctypes import *

mydll = WinDLL(r'C:\temp\example.dll')
txt_path = c_char_p(r'C:\temp\file.txt')

func1 = mydll['func1']
func1.restype = c_long
func1.argtypes = (c_char_p , c_void_p)
handle = func1(txt_path, None)

这是有效的,并返回一个有效的句柄。

使用Python 3.6,第3行会导致错误:

>>> txt_path = c_char_p(r'C:\temp\file.txt')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: bytes or integer address expected instead of str instance

所以我把它改成了

txt_path = c_char_p(b'C:\temp\file.txt')

哪个有效,但导致该功能出现问题。 func1现在返回0,这是“无法读取txt文件”的实习生错误代码。

我尝试使用不同的类型,但它不起作用,我现在有点卡住了。

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:0)

问题只是逃避反斜杠(有人愤世嫉俗的观点可能会说问题是Windows)问题txt_path = c_char_p(b'C:\temp\file.txt')中的行必须改为:

txt_path = c_char_p(b'C:\\temp\\file.txt')