[使用ctypes在python中调用C ++函数

问题描述 投票:1回答:1

我有C ++代码,该代码具有一个需要三个参数的函数

  1. 指针参数
  2. LPWSTR参数
  3. ((LPWSTR变量)引用作为参数下面是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一起发送

请帮助我

python python-3.x ctypes
1个回答
0
投票
type而不是实例,这就是为什么它会给出您看到的错误的原因。

如果您创建一个使用C的实用示例,那么确定如何用Python编写它会更容易,但是我将对此加以介绍。

在功能上正确设置.argtypesrestype,以便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))

© www.soinside.com 2019 - 2024. All rights reserved.