python - Ctypes 错误:调用的过程没有足够的参数(缺少 8 个字节)或错误的调用约定
问题描述
我正在开发一个需要从 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
知道问题可能来自哪里吗?
解决方案
如果是 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.
推荐阅读
- python-3.x - 只将一个文件夹添加到 git repo 但不删除其他已经存在的文件夹?
- c# - Facebook Messenger 上的 Bot 未收到用户的姓名
- monetdb - 惰性逻辑复制 - wlr.replicate 错误
- mongodb - 如何获取包含特定字符串的值 - mongodb
- python - 寻找计算两条曲线之间距离的解决方案
- javascript - 匹配 `.` 但不匹配 `am` 的正则表达式
- javascript - d3.js 数据导入但条形图不显示
- swift - 仅在有足够空间时才显示 SwiftUI 视图
- javascript - 到底是什么导致这个脚本失败?没有控制台错误,在 CodePen 中工作正常
- amazon-web-services - 在 AWS 中为转移的域创建托管区域并链接到 SES 时出现问题