使用Python Ctypes调用Windows 64 Dll



我试图使用ctypes从python调用SimpleMotionv2库,它似乎可以进行调用,但当我为它提供一个有效的com端口时,它总是返回-1。

我已经建立了DLL,我试图调用的函数似乎正确导出:

DLL导出查看器输出

不知何故,我传递的COM端口号不正确?我在windows上,它是COM5…

我调用的函数是smOpenBus(),在这里列出:

smbus smOpenBus( const char * devicename )
{
int handle;
//true on first call
if(smInitialized==smfalse)
smBusesInit();
//find free handle
for(handle=0;handle<SM_MAX_BUSES;handle++)
{
if(smBus[handle].opened==smfalse) break;//choose this
}
//all handles in use
if(handle>=SM_MAX_BUSES) return -1;
//open bus device
smBus[handle].bdHandle=smBDOpen(devicename);
if(smBus[handle].bdHandle==-1) return -1;
//success
strncpy( smBus[handle].busDeviceName, devicename, SM_BUSDEVICENAME_LEN );
smBus[handle].busDeviceName[SM_BUSDEVICENAME_LEN-1]=0;//null terminate string
smBus[handle].opened=smtrue;
return handle;
}

我的Python代码是:

import ctypes as ct
dll = ct.CDLL(r'./SMv2_x64.dll')
dll.smOpenBus.argtypes = ct.c_char_p,
dll.smOpenBus.restype = ct.c_long
ret_val = dll.smOpenBus(b'COM24')
print(ret_val)

我到底做错了什么?我已经尝试使类型c_wchar_p和c_char_p的ptr,添加NULL终止符和字符串,而不是…我期望得到一个COM端口句柄返回,我得到-1。

它是argtypes(复数)并且是一个元组。c_char_p适用于Cchar*:

dll.smOpenBus.argtypes = ct.c_char_p, # comma makes a 1-tuple

然后传递一个字节字符串:

ret_val = dll.smOpenBus(b'COM5')

最新更新