我有C ++代码,该代码具有一个需要三个参数的函数
HRESULT WINAPIV GIDItem (Address* pa, LPWSTR cmdvalue, LPWSTR* string_value)
我能够在Ctypes中加载dll
import ctypes
uDl = ctypes.CDLL(r"test1")
uDl_function=uDl.CAIA # we are creating function pointer
pa=uDl_function('something')
uD = ctypes.CDLL(r"test.dll")
uD_function =uD.GIDItem # we are creating function pointer
string_value= ctypes.c_wchar_p()
cmdvalue=ctypes.c_wchar_p("CM")
dI=uD_function(ctypes.POINTER(pa),cmdvalue,ctypes.byref(string_value))
我遇到错误,
dI=uD_function(ctypes.POINTER(pa),cmdvalue,ctypes.byref(string_value))
TypeError: must be a ctypes type
[我只是看一些有关该DLL的文章,在C ++中,Dll的名称如下所示
fpGIDItem (pA, L"CMD", &cD)
当您查看上面的代码时,“ CMD”是cmdvalue
,并且字符串值与&cD
一起发送
请帮助我
如果您创建一个使用C的实用示例,那么确定如何用Python编写它会更容易,但是我将对此加以介绍。
在功能上正确设置.argtypes
和restype
,以便ctypes
将为您键入check。类似下面的内容应该起作用。
from ctypes import *
dll = CDLL(r'test1')
dll.CAIA.argtypes = c_wchar_p,
dll.CAIA.restype = c_void_p # generic void* should work.
dll2 = ctypes.CDLL(r'test.dll')
dll2.GIDItem.argtypes = c_void_p,c_wchar_p,POINTER(c_wchar_p)
dll2.GIDItem.restype = c_long
pa = dll.CAIA('something')
string_value = c_wchar_p()
result = dll2.GIDItem(pa,'CM',byref(string_value))