首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Python中应用cdll的处理程序问题

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

Stack Overflow用户
提问于 2017-01-16 11:55:11
回答 1查看 1.5K关注 0票数 1

我试图通过Python移植一些C dll(FANUC FOCAS Library - for CNC)代码,所以我编写了移植代码。(如下面所示),但是在加载DLL和调用函数时得到一个非常奇怪的结果。在我的例子中,我不理解在python中使用处理程序。

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

声明( c)

代码语言:javascript
复制
#include "fwlib64.h"
FWLIBAPI short WINAPI cnc_allclibhndl3(const char *ipaddr,unsigned short port,
long timeout, unsigned short *FlibHndl);

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

代码语言:javascript
复制
#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

代码语言:javascript
复制
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

数据窗口函数的返回状态

代码语言:javascript
复制
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.  

我不知道我有什么毛病。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-01-16 19:40:30

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

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

代码语言:javascript
复制
mylib = WinDLL.LoadLibrary('./Fwlib64.dll')

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

代码语言:javascript
复制
mylib.cnc_allclibhndl3.argtypes = c_char_p,c_ushort,c_long,POINTER(c_ushort)
mylib.cnc_allclibhndl3.restype = c_short

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

代码语言:javascript
复制
h = c_ushort()
ret = mylib.cnc_allclibhndl3('192.168.0.100',8193,1,byref(h))

没有提供cnc_statinfocnc_freelibhndl的原型。为它们定义argtypesrestype

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41675881

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档