Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python接口到C++;COM动态链接库_Python_C++_Com_Ctypes - Fatal编程技术网

Python接口到C++;COM动态链接库

Python接口到C++;COM动态链接库,python,c++,com,ctypes,Python,C++,Com,Ctypes,因此,我试图用Python与COM对象进行接口,但遇到了一些困难,因为我不是一个程序员。我以前使用过Python与c DLL的接口,但没有使用COM DLL。但这未必是问题的根源。如有任何帮助或建议,将不胜感激 我已经能够用Python加载该库,其中包括: CiGenUsb = pythoncom.MakeIID(CiGenUsb_string) win32com.client.pythoncom.CoInitialize() disp = win32com.client.gencache.En

因此,我试图用Python与COM对象进行接口,但遇到了一些困难,因为我不是一个程序员。我以前使用过Python与c DLL的接口,但没有使用COM DLL。但这未必是问题的根源。如有任何帮助或建议,将不胜感激

我已经能够用Python加载该库,其中包括:

CiGenUsb = pythoncom.MakeIID(CiGenUsb_string)
win32com.client.pythoncom.CoInitialize()
disp = win32com.client.gencache.EnsureDispatch(CiGenUsb)
我已经能够调用一些函数了,但没有调用下面的函数。函数在C++中定义为:

CIUsb_SendFrame([in] LONG nDevId, [in] BYTE* pFrameData, [in] LONG nSize, [out] LONG* pStatus);
我想用
CIUsb\u SendFrame
发送的数据--
pFrameData
数组--首先用python作为160个整数的数组读取。然后我将其放入一个字节数组(320字节):

代码运行,但输出到代码控制的硬件的帧看起来非常错误。它似乎在一次又一次地改变。所以我假设发送的数据不是
frame\u bytes
中的数据,而是随机数据

COM库还提供了ActiveX自动化环境中使用的所有函数的不同版本,但我对如何使用这些函数的了解更少

谢谢


Edit:我已经调用了
CoInitialize
,我现在已经将其包含在上面的代码片段中<代码>nVid设置为0是正确的。我将尝试为
*pStatus
使用更正确的内容。被控制的硬件由160个像素组成,每个像素可以取2字节的值。但是由于
CIUsb\u SendFrame
函数需要一个
BYTE
数组,因此我创建了320个元素的数组并传递它

您正在调用
CoInitialize
(还是由您导入的模块之一调用)?
nDevID
0是否正常?您还应该传递最后一个参数,它可能会返回有关错误的有用信息。只有
intData
数组中的前160个元素与此处相关吗?您不必编辑原始帖子来回复评论(尽管在本例中,这是可以的,因为您还修改了代码段)。此COM对象是否在自定义dll中定义?(我在互联网上找不到
CIUsb\u SendFrame
refs)。如果是,当从其他地方调用时它是否工作(C)?是,这是一个由硬件提供程序编写的自定义dll。它们提供C++中的示例代码,工作正常。在C++中,函数被称为:<代码> HR=PIHESTRDV-> CiSubSeStFrand(LCUDDEV,(UCHAR *)SMAPATDATA,NUMLUM执行器*SIZEOF(SLAST),LSTATE);code>数据存储在
sMapData
中,其定义为:
USHORT sMapData[160]={0x0000}
frame_bytes_type = ctypes.c_ubyte * 320
frame_bytes = frame_bytes_type()
j=0
for i in range(0,320,2):
    frame_bytes[i] = intData[j]&0xff
    frame_bytes[i+1] = (intData[j]>>8)&0xff
    j=j+1
disp.CIUsb_SendFrame(0, ctypes.addressof(frame_bytes), ctypes.sizeof(frame_bytes),0)