Wie wird eine nichttypische Dll-Funktion mit Python bzw ctypes aufgerufen?
Freebasic erstellt andere Dll als Purebasic.
Ich nehme jetzt Freebasic, weil ich mit Purebasic keine Purebasiceigenen Routinen mit in Python verwenden darf.
Der Aufbau in der dll:
pydll.dll.addi@8.asmadd@8.asmaddp@4.zeiger@4...........
Wenn ich "addi@8" aufrufe, kommt eine Fehlermeldung, das der name nicht vorhanden ist.
Gruss
Eine Nichtypische Windows-Dll-Funktion aufrufen mit Python?
Welchen Hintergrund hat es eigentlich, dass du offenbar ausschließlich Funktionalität von Fremdbibliotheken innerhalb von Python benutzen willst? Ich habe so den Eindruck, dass Python seine Stärken bei dir nicht wirklich ausspielen kann. Von daher stellt sich mir die Frage, wozu dann überhaupt Python?
Es geht um Zeitkritische Routinen, die ich brauche gemischt mit einer Interpretersprache.
Ich habe auch schon Forth genommen, aber da kennen sich die wenigsten mit aus.
...nicht immer, aber immer öfter....
So, jetzt rück mit deiner Hilfe raus...
Es soll auch nicht unter Linux laufen sondern nur bei mir allein unter WINDOWS.
http://www.python-forum.de/viewforum.php?f=25
...da tummeln sich auch die DLL... herausforderer...
Frag die auch mal warum die DLL benutzen...
...dass Python seine Stärken bei denen auch nicht wirklich ausspielen kann....
Danke.
Gruss
Ich habe auch schon Forth genommen, aber da kennen sich die wenigsten mit aus.
...nicht immer, aber immer öfter....

So, jetzt rück mit deiner Hilfe raus...
Es soll auch nicht unter Linux laufen sondern nur bei mir allein unter WINDOWS.
http://www.python-forum.de/viewforum.php?f=25
...da tummeln sich auch die DLL... herausforderer...
Frag die auch mal warum die DLL benutzen...
...dass Python seine Stärken bei denen auch nicht wirklich ausspielen kann....
Danke.
Gruss
Zuletzt geändert von funkheld am Mittwoch 17. November 2010, 14:21, insgesamt 1-mal geändert.
Dann wird es Zeit das du mal über den Tellerrand schaust... sonst kannste bald deinen Tee von der Bahnhofsmission als untergegangener Hartz-Vierer empfangen
Heute haben die beschlossen im Bundestag, das in 10 jahren bis 70 gearbeitet werden soll.
Bin ich froh, das ich meine hohe Pension bekomme, ich mache morgens die Augen auf und das Geld ist da...junge, da träumst du noch 50 Jahre von
, also Jungs, arbeitet für meine hohe Pension...
Gruss

Heute haben die beschlossen im Bundestag, das in 10 jahren bis 70 gearbeitet werden soll.
Bin ich froh, das ich meine hohe Pension bekomme, ich mache morgens die Augen auf und das Geld ist da...junge, da träumst du noch 50 Jahre von




Gruss
funkheld hat geschrieben:So, jetzt rück mit deiner Hilfe raus...
Was glaubst du eigentlich, wie viel Hilfe du mit solchen Sprüchen erwarten kannst ?funkheld hat geschrieben:Dann wird es Zeit das du mal über den Tellerrand schaust... sonst kannste bald deinen Tee von der Bahnhofsmission als untergegangener Hartz-Vierer empfangen
Und das macht es auch nicht besser.funkheld hat geschrieben: Es soll auch nicht unter Linux laufen sondern nur bei mir allein unter WINDOWS.

@funkheld: Ich bin weder 23, noch Informatikstudent und habe im Übrigen einen Job. Mir war nicht bewusst, dass die offensichtliche Ironie bei dir nicht ankommen wird. Das mit Linux stimmt allerdings. Achja, danke für den väterlichen Ratschlag. 

funkheld aka super_castle kann wohl nicht anders. Er trollt auch imXynon1 hat geschrieben:Was glaubst du eigentlich, wie viel Hilfe du mit solchen Sprüchen erwarten kannst ?
PureBasic-Forum herum, wenn er nicht die erwartete Hilfe bekommt.
Scheint so ne Art Tourette-Syndrom zu sein...
Grüße ... Kiffi
Dafür brauche ich aber ein ärztliches Gutachten, um das zu entschuldigen.Kiffi hat geschrieben:Scheint so ne Art Tourette-Syndrom zu sein...

@funkheld: Das ist eher eine FreeBASIC, denn eine Python-Frage. In FreeBASIC gibt es Sprachkonstrukte um eine von C nutzbare Signatur für Funktionen zu erstellen. Wenn man die nicht benutzt, erstellt FreeBASIC nur Namen, in denen auch die Datentypen kodiert sind, da FreeBASIC Funktionsüberladung beherrscht und diese Funktionen dann ja irgendwie auseinander halten können muss.
Und wie immer wäre ein minimales Beispiel und eine konkrete, komplette Fehlermeldung und eine Beschreibung wie der Weg dorthin aussah, nicht schlecht.
Und wie immer wäre ein minimales Beispiel und eine konkrete, komplette Fehlermeldung und eine Beschreibung wie der Weg dorthin aussah, nicht schlecht.
Hmmm....., das ist es nicht...ganz...
ProcedureCDLL das läuft mit Python,...ProcedureDLL das nicht.
Ich kann aber nur den 2. Type herstellen mit Freebasic oder XBLITE.
Und dafür brauche ich die Einleseroutine.
Meldung: Procedure called with not enough arguments(8 byte missing), tritt bei CDLL nicht auf, bloss die CDLL kann ich nicht herstellen.
Der Aufruf : dl.ladewertfor(s,dd) funktioniert mit CDLL.
Gruss
ProcedureCDLL das läuft mit Python,...ProcedureDLL das nicht.
Ich kann aber nur den 2. Type herstellen mit Freebasic oder XBLITE.
Und dafür brauche ich die Einleseroutine.
Meldung: Procedure called with not enough arguments(8 byte missing), tritt bei CDLL nicht auf, bloss die CDLL kann ich nicht herstellen.
Der Aufruf : dl.ladewertfor(s,dd) funktioniert mit CDLL.
Gruss
@funkheld: Was ist ProcedureCDLL oder ProcedureDLL? Kann beides nicht in der FreeBASIC-Dokumentation finden. Und Dein genaues Vorgehen hast Du auch nicht beschrieben.
Woher weisst Du das eine Meldung bei einer "CDLL" nicht auftritt, wenn Du eine solche nicht erstellen kannst!?
Was nützt die Info, dass Du ``dl.ladewertfor(s,dd)`` aufrufen kannst, wenn niemand ausser Dir weiss, was `dl`, `ladewertfor`, `s`, und `dd` überhaupt sind!?
Woher weisst Du das eine Meldung bei einer "CDLL" nicht auftritt, wenn Du eine solche nicht erstellen kannst!?
Was nützt die Info, dass Du ``dl.ladewertfor(s,dd)`` aufrufen kannst, wenn niemand ausser Dir weiss, was `dl`, `ladewertfor`, `s`, und `dd` überhaupt sind!?
Was kann funkheld denn dafür, dass bei uns allen wieder /dev/glaskugel kaputt ist?BlackJack hat geschrieben:Was nützt die Info, dass Du ``dl.ladewertfor(s,dd)`` aufrufen kannst, wenn niemand ausser Dir weiss, was `dl`, `ladewertfor`, `s`, und `dd` überhaupt sind!?
Das Leben ist wie ein Tennisball.
da sind sie:
Code: Alles auswählen
DECLARE FUNCTION multl LIB "testdll" ALIAS "multl" (ByVal c AS Integer) AS Integer
DECLARE FUNCTION multf LIB "testdll" ALIAS "multf" (ByVal c AS single) AS Single
DECLARE FUNCTION addasm LIB "testdll" ALIAS "addasm" (BYREF a AS INTEGER, BYREF b AS INTEGER) AS Integer
DECLARE FUNCTION ladewertfor LIB "testdll" ALIAS "ladewertfor" (ByVal c AS Integer Ptr,ByVal anz AS Integer) AS Integer
DECLARE FUNCTION ladewert LIB "testdll" ALIAS "ladewert" (ByVal c AS Integer Ptr,ByVal zz AS Integer,ByVal zbyte AS Byte) AS Integer
Function multl (ByVal c AS Integer) AS Integer Export
Dim z As Integer
z=c*5
Return z
End Function
Function multf (ByVal c AS single) AS Single Export
Dim z As Single
z=c*5
Return z
End Function
FUNCTION addasm (BYREF a AS INTEGER, BYREF b AS INTEGER) AS INTEGER EXPORT
ASM
mov esi, [a]
mov eax, [esi]
mov esi, [b]
mov ebx, [esi]
ADD eax, ebx
mov [FUNCTION], eax
END ASM
END Function
Function ladewertfor (ByVal c AS Integer Ptr,ByVal anz AS Integer) AS Integer Export
Dim z As Integer
For z=0 To anz
*c=65+z
c=c+1
Next
End Function
Function ladewert (ByVal c AS Integer Ptr,ByVal zz AS Integer,ByVal zbyte AS Byte) AS Integer Export
c=c+zz
*c=zbyte
End Function
@funkheld: Das kompiliert bei mir nicht, weil man dafür ja schon eine Bibliothek *braucht* die "testdll" heisst. Du sagst in den ``Declare``-Anweisungen am Anfang ja, dass diese Funktionen in der DLL zu finden sind, und dass die dazu gelinkt werden soll.
Ansonsten gibt der Compiler noch zwei Warnungen aus, weil die Funktionen `ladewertfor` und `ladewert` zwar einen Rückgabetyp deklariert haben, aber nirgendwo etwas zurückgeben!?
Ansonsten schau doch mal in der Doku zu FreeBASIC welche Aufrufkonvention bei den Funktionen verwendet wird, und dann in der Doku zu `ctypes` über welches Objekt man die Bibliothek dann laden muss.
Ansonsten gibt der Compiler noch zwei Warnungen aus, weil die Funktionen `ladewertfor` und `ladewert` zwar einen Rückgabetyp deklariert haben, aber nirgendwo etwas zurückgeben!?
Ansonsten schau doch mal in der Doku zu FreeBASIC welche Aufrufkonvention bei den Funktionen verwendet wird, und dann in der Doku zu `ctypes` über welches Objekt man die Bibliothek dann laden muss.
@funkheld:
Offensichtlich hast Du meinen letzten Post zu den Aufrufkonventionen ignoriert, ansonsten wäre Dir der Unterschied zwischen ProcedureDLL und -CDLL klar. Übertragen auf dein jetziges Problem heisst das, dass Freebasic unter Windows nur stdcall unterstützt. Damit werden auch die Symbole mit dem Funktionsname@Nummer in der DLL erklärbar.
PS: Ich kenne Freebasic nicht, allerdings scheint es auch cdecl zu verstehen. Siehe http://www.lowlevel.eu/wiki/FreeBASIC, zweites Beispiel.
Offensichtlich hast Du meinen letzten Post zu den Aufrufkonventionen ignoriert, ansonsten wäre Dir der Unterschied zwischen ProcedureDLL und -CDLL klar. Übertragen auf dein jetziges Problem heisst das, dass Freebasic unter Windows nur stdcall unterstützt. Damit werden auch die Symbole mit dem Funktionsname@Nummer in der DLL erklärbar.
PS: Ich kenne Freebasic nicht, allerdings scheint es auch cdecl zu verstehen. Siehe http://www.lowlevel.eu/wiki/FreeBASIC, zweites Beispiel.
@jerch: Die verschiedenen Aufrufkonventionen, die FreeBASIC unterstützt, werden in dessen Dokumentation (kann man als CHM-Datei von der Homepage herunterladen) ausführlich erklärt. Was sie technisch gesehen bedeuten und wo sie eingesetzt werden -- sowohl Sprachen als auch Betriebssysteme. Und ziemlich am Anfang von der `ctypes`-Dokumentation steht auch etwas dazu -- sogar mit den gleichen Begriffen für die beiden Konventionen, die beide Seiten beherrschen. (FreeBASIC kennt noch eine dritte Variante, ``pascal``, die neben dem Namensgeber auch vom Vorbild QBasic und von Windows 3.x verwendet wird.)
Hmmm...., ist schon ein graus.
Du hast recht, Freebasic macht anderen Mist.
Hab jetzt mal "XBLITE" , ist Freeware ausprobiert,...
, macht eigentlich gute Sachen.
Davon laufen die DLL, bis auf die Floatrückgabe bzw Floatausgabe von Python.
Die Ausgabe von "d" ist "nan", also 3 Zeichen. Wie kommt die Floatausgabe hier?
XBLite:

Du hast recht, Freebasic macht anderen Mist.
Hab jetzt mal "XBLITE" , ist Freeware ausprobiert,...

Davon laufen die DLL, bis auf die Floatrückgabe bzw Floatausgabe von Python.
Die Ausgabe von "d" ist "nan", also 3 Zeichen. Wie kommt die Floatausgabe hier?
Code: Alles auswählen
from sys import *
import ctypes
f = ctypes.windll.LoadLibrary("pydll.dll")
f.multf.restype = ctypes.c_float
c=10.788
d=f.multf(ctypes.c_float(c))
print d >>>>>>>>>>> ausgabe ist "nan" als Buchstaben ???
Code: Alles auswählen
PROGRAM "pydll"
EXPORT
DECLARE FUNCTION multf ( SINGLE varf)
END EXPORT
FUNCTION multf (SINGLE varf)
SINGLE wertf
wertf=11.5*varf
RETURN wertf
END FUNCTION
END PROGRAM
@funkheld: FreeBASIC mach keinen "anderen Mist", sondern lässt Dir die Wahl. Du musst sie nur treffen und auf beiden Seiten -- FreeBASIC und `cpython` -- das jeweils passende wählen.
"Not a number" ("nan") ist der Wert für Ergebnisse die keine Zahl sind. Du verwendest wahrscheinlich in BASIC den falschen Datentyp. ``SINGLE`` klingt nach 4-Byte Fliesskommazahlen, `float` ist in Python aber 8 Bytes gross.
Edit: Sehe gerade dass Du ja `c_float` verwendet hast, daran kann es dann also nicht liegen. Dann weiss ich's auch nicht.
"Not a number" ("nan") ist der Wert für Ergebnisse die keine Zahl sind. Du verwendest wahrscheinlich in BASIC den falschen Datentyp. ``SINGLE`` klingt nach 4-Byte Fliesskommazahlen, `float` ist in Python aber 8 Bytes gross.
Edit: Sehe gerade dass Du ja `c_float` verwendet hast, daran kann es dann also nicht liegen. Dann weiss ich's auch nicht.
Ja, sonst funktioniert es wunderbar in XBLite mit der DLL.
Ich brauch mich hier auch nicht mehr um ASM-Code zu kümmern.
Der XBLite schlägt alle Recorde.
Um einen bestimmten Bildpunkt auszuwerten aus einem 100kbBild, braucht er für das Arry, welches ich von Python übergebe 0.05 sec.
Eine Forschleife 10000000 mit 10000000x einen Wert an eine Variable zu übergeben braucht er 0.5 sec. So etwas brauche ich unter anderem bei dem Pythoninterpreter.
Der hat andere Stärken.
Gruss
Ich brauch mich hier auch nicht mehr um ASM-Code zu kümmern.
Der XBLite schlägt alle Recorde.
Um einen bestimmten Bildpunkt auszuwerten aus einem 100kbBild, braucht er für das Arry, welches ich von Python übergebe 0.05 sec.
Eine Forschleife 10000000 mit 10000000x einen Wert an eine Variable zu übergeben braucht er 0.5 sec. So etwas brauche ich unter anderem bei dem Pythoninterpreter.
Der hat andere Stärken.
Gruss