Seite 1 von 2

Eine Nichtypische Windows-Dll-Funktion aufrufen mit Python?

Verfasst: Mittwoch 17. November 2010, 13:25
von funkheld
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

Re: Eine Nichtypische Windows-Dll-Funktion aufrufen mit Pyth

Verfasst: Mittwoch 17. November 2010, 14:05
von snafu
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?

Re: Eine Nichtypische Windows-Dll-Funktion aufrufen mit Pyth

Verfasst: Mittwoch 17. November 2010, 14:11
von funkheld
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.... :D

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

Re: Eine Nichtypische Windows-Dll-Funktion aufrufen mit Pyth

Verfasst: Mittwoch 17. November 2010, 14:19
von snafu
Tut mir leid. Als 23jähriger Informatikstudent (wie wir ja offenbar alle für dich sind) benutze ich kein Windows sondern Linux. 8)

Re: Eine Nichtypische Windows-Dll-Funktion aufrufen mit Pyth

Verfasst: Mittwoch 17. November 2010, 14:25
von funkheld
Dann wird es Zeit das du mal über den Tellerrand schaust... sonst kannste bald deinen Tee von der Bahnhofsmission als untergegangener Hartz-Vierer empfangen :D

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 :D , also Jungs, arbeitet für meine hohe Pension... :D :D :D

Gruss

Re: Eine Nichtypische Windows-Dll-Funktion aufrufen mit Pyth

Verfasst: Mittwoch 17. November 2010, 14:36
von Xynon1
funkheld hat geschrieben:So, jetzt rück mit deiner Hilfe raus...
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
Was glaubst du eigentlich, wie viel Hilfe du mit solchen Sprüchen erwarten kannst ?
funkheld hat geschrieben: Es soll auch nicht unter Linux laufen sondern nur bei mir allein unter WINDOWS.
Und das macht es auch nicht besser. :)

Re: Eine Nichtypische Windows-Dll-Funktion aufrufen mit Pyth

Verfasst: Mittwoch 17. November 2010, 14:42
von snafu
@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. :)

Re: Eine Nichtypische Windows-Dll-Funktion aufrufen mit Pyth

Verfasst: Mittwoch 17. November 2010, 14:54
von Kiffi
Xynon1 hat geschrieben:Was glaubst du eigentlich, wie viel Hilfe du mit solchen Sprüchen erwarten kannst ?
funkheld aka super_castle kann wohl nicht anders. Er trollt auch im
PureBasic-Forum herum, wenn er nicht die erwartete Hilfe bekommt.

Scheint so ne Art Tourette-Syndrom zu sein...

Grüße ... Kiffi

Re: Eine Nichtypische Windows-Dll-Funktion aufrufen mit Pyth

Verfasst: Mittwoch 17. November 2010, 15:14
von Xynon1
Kiffi hat geschrieben:Scheint so ne Art Tourette-Syndrom zu sein...
Dafür brauche ich aber ein ärztliches Gutachten, um das zu entschuldigen. :)

Re: Eine Nichtypische Windows-Dll-Funktion aufrufen mit Pyth

Verfasst: Mittwoch 17. November 2010, 15:33
von BlackJack
@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.

Re: Eine Nichtypische Windows-Dll-Funktion aufrufen mit Pyth

Verfasst: Mittwoch 17. November 2010, 18:15
von funkheld
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

Re: Eine Nichtypische Windows-Dll-Funktion aufrufen mit Pyth

Verfasst: Mittwoch 17. November 2010, 19:06
von BlackJack
@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!?

Re: Eine Nichtypische Windows-Dll-Funktion aufrufen mit Pyth

Verfasst: Mittwoch 17. November 2010, 19:14
von EyDu
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!?
Was kann funkheld denn dafür, dass bei uns allen wieder /dev/glaskugel kaputt ist?

Re: Eine Nichtypische Windows-Dll-Funktion aufrufen mit Pyth

Verfasst: Mittwoch 17. November 2010, 19:47
von funkheld
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





Re: Eine Nichtypische Windows-Dll-Funktion aufrufen mit Pyth

Verfasst: Mittwoch 17. November 2010, 20:11
von BlackJack
@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.

Re: Eine Nichtypische Windows-Dll-Funktion aufrufen mit Pyth

Verfasst: Donnerstag 18. November 2010, 00:10
von jerch
@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.

Re: Eine Nichtypische Windows-Dll-Funktion aufrufen mit Pyth

Verfasst: Donnerstag 18. November 2010, 00:21
von BlackJack
@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.)

Re: Eine Nichtypische Windows-Dll-Funktion aufrufen mit Pyth

Verfasst: Donnerstag 18. November 2010, 10:22
von funkheld
Hmmm...., ist schon ein graus. :D
Du hast recht, Freebasic macht anderen Mist.

Hab jetzt mal "XBLITE" , ist Freeware ausprobiert,... :D , 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?

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 ???
XBLite:

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


Re: Eine Nichtypische Windows-Dll-Funktion aufrufen mit Pyth

Verfasst: Donnerstag 18. November 2010, 10:43
von BlackJack
@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.

Re: Eine Nichtypische Windows-Dll-Funktion aufrufen mit Pyth

Verfasst: Donnerstag 18. November 2010, 17:28
von funkheld
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