2017-01-16 7 views
1

Я пытаюсь портировать код C dll (FANUC FOCAS Library - для ЧПУ) через Python с использованием ctypes, поэтому я написал код переноса. (как belows), но получить очень странный результат при загрузке DLL и вызове функции. В моем случае я не понимаю использование обработчика в python.Проблемы с обработчиком Применение cdll в Python

Я хотел бы применить следующий код c в python.

декларация (для с)

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

Пример кода (в библиотеке Фока пособие для с)

#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 (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. 

Я не знаю, что я был что-то плохо с чем-то.

ответ

1

CDLL предназначенный для __cdecl призвание конвенция. cdll не рекомендуется использовать, поскольку это общий экземпляр для всех модулей.

WINAPI определяется как __stdcall, так что используйте WinDLL:

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

Далее определите argtypes и restype для ваших аргументов и типов для функции:

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_statinfo и cnc_freelibhndl не были. Определите argtypes и restype для них.

+0

Благодарим за помощь. После изменения вышеуказанного исходного кода происходит следующая ошибка. ret = mylib.cnc_allclibhndl3 ('192.168.0.100', 8193,1, byref (h)) ctypes.ArgumentError: аргумент 1: <класс 'TypeError'>: неправильный тип – Dogdripnet

+0

Вы, скорее всего, на Python 3. Pass байтовая строка в качестве первого параметра. 'B'192.168.0.100''. Строки Unicode соответствуют 'c_wchar_t'. –

+0

Вы правы. Моя среда разработки - «Python3». Спасибо за помощь! – Dogdripnet

Смежные вопросы