Ctypes错误:没有足够的参数(缺少8个字节)或错误的调用约定调用了过程

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

我正在研究需要从Imperx卡(HD-SDI Express VCE-HDEX03)检索视频流的python程序。我使用ctypes(cdll.LoadLibrary())加载SDK dll。

我在功能上遇到交流问题。根据文档,如果我使用C ++进行编码,则应该执行此操作:

VCESDI_EnumData enumData;
enumData.cbSize = sizeof(VCESDI_EnumData);

VCESDI_ENUM hDevEnum = VCESDI_EnumInit();

while(VCESDI_EnumNext(hDevEnum, &enumData) == VCESDI_Err_Success)
{
    // Do some stuff
}

我从代码中的以下函数获得第一个参数:

hDevEnum = wintypes.HANDLE(lib.VCESDI_EnumInit()) # hdevEnum = 0 if no card connected otherwise a random number (always around 8000000)

在文档中,像这样声明VCESDI_EnumData:

struct VCESDI_EnumData
{
    UINT32 cbSize; //Size of structure. Should be initialized to sizeof(VCESDI_EnumData) before passing to VCESDI_EnumNext function
    UINT32 dwSlot; //System defined slot number
    VCESDI_DeviceData; //Pointer to device initialization data
    LPCWSTR pSlotName; //Pointer to system defined slot name
}

而且我创建了第二个这样的参数:

class VCESDI_EnumData(ct.Structure):
    _fields_ = [("cbSize", ct.c_int),
                ("dwSlot", ct.c_int),
                ("deviceData", ct.c_void_p),
                ("pSlotName", ct.c_void_p)]

以及我其余的代码:

enumData = VCESDI_EnumData()
enumData.cbSize = ct.sizeof(VCESDI_EnumData)
hDevEnum = wintypes.HANDLE(lib.VCESDI_EnumInit())
while lib.VCESDI_EnumNext(hDevEnum, ct.byref(enumData)) == 0:
    continue

最后,当我启动代码时,出现以下错误:

File "HD-SDI_script.py", line 39 in <module>
    while lib.VCESDI_EnumNext(hDevEnum, ct.byref(enumData)) == 0:
ValueError: Procedure called with not enough arguments (8 bytes missing) or wrong calling convention

任何想法可能出在哪里?

python dll ctypes
1个回答
0
投票

如果是32位代码,请使用WinDLL而不是CDLL来加载库。在64位上,它们是相同的调用约定,没关系,但在32位上则不是。

lib = ctypes.WinDLL('example')  # Uses __stdcall calling convention for functions in example.dll.
lib = ctypes.CDLL('example')    # Uses __cdecl calling convention for functions in example.dll.
© www.soinside.com 2019 - 2024. All rights reserved.