【问题标题】:Handler Issues Applying cdll in Python在 Python 中应用 cdll 的处理程序问题
【发布时间】:2017-01-16 11:55:11
【问题描述】:

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

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

声明(针对 c)

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

示例代码(在 c 的 focas 库手册中)

#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 ) ;   
}
}

Testfocas.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(我猜是开放端口)

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.  

我不知道我做错了什么。

【问题讨论】:

    标签: python c dll ctypes


    【解决方案1】:

    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
    

    最后,通过引用传递输出参数。比创建pointer效率更高:

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

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

    【讨论】:

    • 感谢您的帮助。修改上述源码后,出现如下错误。 ret=mylib.cnc_allclibhndl3('192.168.0.100',8193,1,byref(h)) ctypes.ArgumentError: argument 1: : wrong type
    • 您可能使用的是 Python 3。将字节字符串作为第一个参数传递。 b'192.168.0.100'。 Unicode 字符串对应于c_wchar_t
    • 你是对的。我的开发环境是'Python3'。感谢您的帮助!
    猜你喜欢
    • 2013-08-26
    • 2018-10-13
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 2014-03-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多