2012-01-09 22 views
8

Sto provando a chiamare le funzioni da una DLL che sembra essere stata creata in Delphi. Un esempio di alcune funzioni supportate dalla DLL sono:Python può chiamare le funzioni Delphi in una DLL?

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

codice Python ho scritto per accedere alle funzioni di cui sopra non funziona.

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

pi = pointer(name) 

delname = libc.oziDeleteWpByName 

delname(name) 

sembra che io sto passando il tipo di dati sbagliato alla funzione. Qualche idea su come farlo nel modo giusto?

Grazie ha funzionato. Ora per favore aiuto con questa funzione:

function oziGetOziVersion (var Versione: pansichar; var DataLength: intero): intero; stdcall; La versione di OziExplorer viene restituita nella variabile Version.

Ora come faccio a passare "versione var" quando è quella che verrà restituita.

+0

'var nome: pansichar' implica che il parametro' name' può essere modificato e restituito al chiamante. La funzione lo fa davvero? Stai pensando di leggere il contenuto di 'name' dopo che la funzione è tornata? –

+0

Inoltre, quale versione di Python stai usando? Può fare la differenza per le codifiche di stringhe. –

+0

sì, quella dichiarazione 'var' è fishy. Se tu, utente 1138 ... hai scritto quella DLL, perché l'hai fatto? –

risposta

1

In Delphi, un parametro var viene passato per riferimento. Quindi quello che hai è un puntatore a un PAnsiChar (noto anche come puntatore di stringa in stile C). Se si passa a un puntatore a stringa, anziché un puntatore a un puntatore a stringa, non funzionerà.

+0

Anche io non vedo in quel codice Python qualcosa che suggerisce che stai specificando la convenzione di chiamata 'stdcall'. Non 'cdll' in Python predefinito su' cdecl'? Se è così, questo causerà anche problemi! – LaKraven

+0

Sono abbastanza sicuro che qualsiasi cosa invochi tramite una DLL e che la libreria di runtime di Python carica e invoca, utilizzerà sempre le convenzioni di chiamata standard di Windows. –

+2

@Warren No, LaKraven ha ragione. 'cdll' vs' windll' è il modo per specificare le convenzioni di chiamata. Inoltre, non esiste uno standard di Windows per chiamare la convenzione, almeno su x86. Alcune librerie usano 'stdcall' e alcuni usano' cdecl'. Pensa ad esempio a msvcrt. È tutto '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

Buon punto. Fisso. – yak

+0

Aggiornato con 'argtypes' e' restype'. – yak

+0

Bene, hai il mio upvote ora –

Problemi correlati