2012-01-09 92 views
8

我想從一個似乎在Delphi中創建的DLL中調用函數。的由DLL支持的一些功能的一例是:Python可以在DLL中調用Delphi函數嗎?

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

我寫的Python代碼訪問上述功能不工作。

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

pi = pointer(name) 

delname = libc.oziDeleteWpByName 

delname(name) 

看來我錯誤的數據類型傳遞給函數。任何想法如何做到這一點對嗎?

感謝它的工作。現在請使用此功能:

function oziGetOziVersion(var Version:pansichar; var DataLength:integer):integer; stdcall; OziExplorer的版本在Version變量中返回。

現在如何通過'var版'時,它也將返回。

+0

'var name:pansichar'意味着'name'參數可以被修改並返回給調用者。這個函數真的這麼做嗎?你打算在函數返回後讀取'name'的內容嗎? – 2012-01-09 15:03:54

+0

另外,您正在使用哪個版本的Python?可以改變字符串編碼。 – 2012-01-09 15:06:48

+0

是的,那個'var'聲明是可疑的。如果你,用戶1138 ...寫了這個DLL,你爲什麼這麼做? – 2012-01-09 15:07:47

回答

1

在Delphi中,var參數通過引用傳遞。所以你在那裏有一個指向PAnsiChar(又名C風格的字符串指針)的指針。如果你傳遞一個字符串指針,而不是一個指向字符串指針的指針,它將不起作用。

+0

我也沒有在Python代碼中看到任何暗示你指定'stdcall'調用約定的東西。 Python中的'cdll'是否默認爲'cdecl'?如果是這樣,這也會導致你的問題! – LaKraven 2012-01-09 14:59:25

+0

我非常確定,通過dll調用的任何東西以及python運行時庫加載和調用的東西都將使用windows標準調用約定。 – 2012-01-09 15:09:29

+2

@沃倫不,拉克拉文是對的。 'cdll' vs'windll'是指定調用約定的方式。此外,至少在x86上,沒有用於調用約定的Windows標準。一些庫使用'stdcall',一些使用'cdecl'。以msvcrt爲例。這全是'cdecl'。 – 2012-01-09 15:11:31

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 2012-01-09 15:03:19

+0

更新爲'argtypes'和'restype'。 – yak 2012-01-09 15:14:33

+0

好,你已經得到我的upvote – 2012-01-09 15:15:29

相關問題