2012-01-09 11 views
8

私はDelphiで作成されたようなDLLから関数を呼び出そうとしています。 DLLでサポートされているいくつかの機能の例は以下のとおりです。私は上記の機能にアクセスするために書かれているPythonがDelphiをDLLで呼び出すことはできますか?

function oziDeleteWpByName(var name:pansichar):integer;stdcall 

Pythonのコードが機能していません。

from ctypes import * 
libc = cdll.OziAPI 
name ='test' 

pi = pointer(name) 

delname = libc.oziDeleteWpByName 

delname(name) 

私は間違ったデータ型を関数に渡しているようです。どのようにそれを正しく行うための任意のアイデアですか?

ありがとうございました。今度はこの関数を使って助けてください:

関数oziGetOziVersion(varバージョン:pansichar; var DataLength:整数):整数; stdcall; バージョン変数にOziExplorerのバージョンが戻されます。

返されるものがある場合、どうすれば 'var version'を渡すのですか?

+0

'var name:pansichar'は、' name'パラメータを変更して呼び出し側に返すことを意味します。関数は実際にそれをしますか?関数が返った後に 'name'の内容を読むつもりですか? –

+0

また、どのバージョンのPythonを使用していますか?文字列のエンコーディングに違いを生むことができます。 –

+0

ええ、 'var'宣言は怪しいです。あなた1138さんがそのDLLを書いたのですが、どうしてですか? –

答えて

1

デルファイでは、varパラメータが参照渡しされます。だからあなたが持っているのはPAnsiChar(別名Cスタイルの文字列ポインタ)へのポインタです。文字列ポインタへのポインタの代わりに文字列ポインタを渡している場合、それは機能しません。

+0

また、Pythonコードでは、あなたが 'stdcall'呼び出し規約を指定していることを示唆しているものはありません。 Pythonの 'cdll'はデフォルトで' cdecl'になっていませんか?もしそうなら、これもあなたに問題を引き起こすでしょう! – LaKraven

+0

私はあなたがDLL経由で起動し、Pythonランタイムライブラリがロードして呼び出すものは、常にWindowsの標準呼び出し規約を使用すると確信しています。 –

+2

@Warrenいいえ、LaKravenは正しいです。 'cdll'と' windll'は呼び出し規約を指定する方法です。また、少なくともx86では呼び出し規約のWindows標準はありません。いくつかのライブラリは 'stdcall'を使い、' cdecl'を使うライブラリもあります。例えばmsvcrtを考えてみてください。それはすべて 'cdecl'です。 –

11
from ctypes import * 

# Not strictly needed but it's good to be explicit. 
windll.OziAPI.oziDeleteWpByName.argtypes = [POINTER(c_char_p)] 
windll.OziAPI.oziDeleteWpByName.restype = c_int 

p = c_char_p('test') 
retval = windll.OziAPI.oziDeleteWpByName(byref(p)) 
+0

良い点。一定。 – yak

+0

'argtypes'と' restype'で更新されました。 – yak

+0

良い、あなたは今私のupvoteを持っている –

関連する問題