2017-01-16 4 views
1

私はctypesを使用してPython経由でいくつかのC dll(FANUC FOCASライブラリ - CNC用)コードを移植しようとしているので、移植コードを書きました。 (以下のように)、DLLをロードして関数を呼び出すと非常に奇妙な結果が得られます。私の場合、私はPythonでハンドラを使用することを理解していません。ハンドラの問題Pythonでcdllを適用する

私は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を返すようにしたいけど、私の場合、関数の戻り値は、私は私が何であったか知らない

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. 

データウィンドウ関数の

cnc_allclibhndl3 = 65520 (i guess open port)

cnc_statinfo = -8

cnc_freelibhndl -8

戻りステータスがあります間違っている。

答えて

1

CDLL__cdeclの呼び出し規約です。 cdllはモジュール間の共有インスタンスであるため、使用することはお勧めしません。

WINAPIWinDLL__stdcallのように定義するので、使用されています、最後に

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

出力パラメータを渡す:

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

次に、あなたの関数のためのあなたの引数と結果の型のためargtypesrestypeを定義します参照により。提供されていなかったcnc_statinfocnc_freelibhndlため

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

プロトタイプ:それはpointerを作成するよりも効率的です。同様にargtypesrestypeを定義します。

+0

ありがとうございました。 上記のソースコードを修正した後、次のエラーが発生します。 ret = mylib.cnc_allclibhndl3( '192.168.0.100'、8193,1、byref(h)) ctypes.ArgumentError:引数1::タイプが間違っています – Dogdripnet

+0

あなたはPython 3の可能性が高いです。合格最初のパラメータとしてのバイト文字列。 'b'192.168.0.100''。 Unicode文字列は 'c_wchar_t'に対応します。 –

+0

あなたは正しいです。私の開発環境はPython3です。ご協力ありがとうございました! – Dogdripnet

関連する問題