2012-01-09 13 views
8

Próbuję wywoływać funkcje z biblioteki DLL, która wydaje się być utworzona w Delphi. Przykładem a niektórych funkcji obsługiwanych przez DLL są:Czy Python może wywoływać funkcje Delphi w bibliotece DLL?

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

kod Pythona Pisałem aby uzyskać dostęp do powyższych funkcji nie działa.

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

pi = pointer(name) 

delname = libc.oziDeleteWpByName 

delname(name) 

Wygląda na to, że przekazuję nieprawidłowy typ danych do funkcji. Wszelkie pomysły, jak to zrobić dobrze?

Dzięki temu zadziałało. Teraz pomóż z tą funkcją:

funkcja oziGetOziVersion (var Wersja: pansichar; var DataLength: integer): integer; stdcall; Wersja OziExplorer jest zwracana w zmiennej Wersja.

Teraz, jak przekazać "var version", gdy ten, który również zostanie zwrócony.

+0

'var nazwa: pansichar' oznacza, że ​​parametr' name' można zmodyfikować i zwrócić do osoby dzwoniącej. Czy funkcja naprawdę to robi? Czy planujesz przeczytać zawartość 'name' po powrocie funkcji? –

+0

Którą wersję Pythona używasz? Może wprowadzić zmiany w kodowaniu ciągów znaków. –

+0

tak, deklaracja 'var' jest podejrzana. Jeśli Ty, użytkownik 1138 ... napisał tę bibliotekę DLL, dlaczego to zrobiłeś? –

Odpowiedz

1

W Delphi parametr var jest przekazywany jako odniesienie. Więc to, co tam masz, to wskaźnik do PAnsiChar (również jako wskaźnika łańcucha w stylu C). Jeśli przekazujesz mu wskaźnik łańcuchowy, zamiast wskaźnika do wskaźnika łańcucha, to nie zadziała.

+0

Nie widzę również w tym kodzie Pythona niczego, co sugeruje, że określasz konwencję wywołania 'stdcall'. Czy "cdll" w Pythonie nie jest domyślnie "cdecl"? Jeśli tak, spowoduje to również problemy! – LaKraven

+0

Jestem prawie pewny, że wszystko, co wywołasz przez bibliotekę dll i którą biblioteka uruchomieniowa Pythona ładuje i wywołuje, zawsze używa standardowych konwencji wywoływania systemu Windows. –

+2

@Warren Nie, LaKraven ma rację. 'cdll' vs' windll' to sposób określania konwencji wywoływania. Ponadto nie ma standardu Windows do wywoływania konwencji, przynajmniej na x86. Niektóre biblioteki używają 'stdcall', a niektóre używają' cdecl'. Pomyśl o msvcrt na przykład. To wszystko '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

Dobra uwaga. Naprawiony. – yak

+0

Zaktualizowano za pomocą 'argtypes' i' restype'. – yak

+0

Dobrze, masz moje upvote teraz –

Powiązane problemy