gpt4 book ai didi

python - 在 Python 中应用 cdll 的处理程序问题

转载 作者:太空宇宙 更新时间:2023-11-04 03:25:18 27 4
gpt4 key购买 nike

我正在尝试使用 ctypes 通过 Python 移植一些 C dll(FANUC FOCAS Library - for CNC)代码,所以我编写了移植代码。 (如下),但是在加载DLL和调用函数时得到一个很奇怪的结果。就我而言,我不明白在 python 中使用处理程序。

我想在 python 中应用以下 c 代码。

声明(for c)

#include "fwlib64.h"
FWLIBAPI short WINAPI cnc_allclibhndl3(const char *ipaddr,unsigned short port,
long timeout, unsigned short *FlibHndl);

示例代码(在focas library manual for c)

#include "fwlib64.h"
void example( void )
{
unsigned short h;
short ret;
ODBST buf;
ret = cnc_allclibhndl3( "192.168.0.100", 8193, 1, &h ) ;
//
if ( !ret ) {
cnc_statinfo( h, &buf ) ;
cnc_freelibhndl( h ) ;
} else {
printf( "ERROR!(%d)\n", ret ) ;
}
}

测试焦点.py

from ctypes import *
mylib = cdll.LoadLibrary('./Fwlib64.dll')
class ODBSYS(Structure):
pass
_fields_ =[
("dummy", c_ushort),
("max_axis", c_char*2),
("cnc_type", c_char*2),
("mt_type",c_char*2),
("series",c_char*4),
("version",c_char*4),
("axes",c_char*2),]

h=c_ushort()
pt=pointer(h)
ret=c_short()
buf=ODBSYS()

ret=mylib.cnc_allclibhndl3('192.168.0.100',8193,1,pt)
mylib.cnc_statinfo(h,buf)
mylib.cnc_freelibhndl(h)

我希望函数返回 0 或 -16,但在我的例子中,函数返回值是

cnc_allclibhndl3 = 65520 (i guess open port)

cnc_statinfo = -8

cnc_freelibhndl -8

数据窗口函数的返回状态

EW_OK(0)  Normal termination  
EW_SOCKET(-16) Socket communication error Check the power supply of CNC, Ethernet I/F board, Ethernet connection cable.
EW_HANDLE(-8) Allocation of handle number is failed.

我不知道我做错了什么。

最佳答案

CDLL 用于__cdecl 调用约定。 cdll 不推荐使用,因为它是跨模块的共享实例。

WINAPI 被定义为 __stdcall,所以使用 WinDLL:

mylib = WinDLL.LoadLibrary('./Fwlib64.dll')

接下来,为函数的参数和结果类型定义 argtypesrestype:

mylib.cnc_allclibhndl3.argtypes = c_char_p,c_ushort,c_long,POINTER(c_ushort)
mylib.cnc_allclibhndl3.restype = c_short

最后,通过引用传递输出参数。它比创建一个指针更有效率:

h = c_ushort()
ret = mylib.cnc_allclibhndl3('192.168.0.100',8193,1,byref(h))

未提供 cnc_statinfocnc_freelibhndl 的原型(prototype)。也为它们定义 argtypesrestype

关于python - 在 Python 中应用 cdll 的处理程序问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41675881/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com