Eine Nichtypische Windows-Dll-Funktion aufrufen mit Python?

Python in C/C++ embedden, C-Module, ctypes, Cython, SWIG, SIP etc sind hier richtig.
funkheld
User
Beiträge: 258
Registriert: Sonntag 31. Oktober 2010, 09:26

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
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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?
funkheld
User
Beiträge: 258
Registriert: Sonntag 31. Oktober 2010, 09:26

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
Zuletzt geändert von funkheld am Mittwoch 17. November 2010, 14:21, insgesamt 1-mal geändert.
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Tut mir leid. Als 23jähriger Informatikstudent (wie wir ja offenbar alle für dich sind) benutze ich kein Windows sondern Linux. 8)
funkheld
User
Beiträge: 258
Registriert: Sonntag 31. Oktober 2010, 09:26

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
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

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. :)
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

@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. :)
Benutzeravatar
Kiffi
User
Beiträge: 6
Registriert: Samstag 13. November 2010, 11:32

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
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

Kiffi hat geschrieben:Scheint so ne Art Tourette-Syndrom zu sein...
Dafür brauche ich aber ein ärztliches Gutachten, um das zu entschuldigen. :)
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
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.
funkheld
User
Beiträge: 258
Registriert: Sonntag 31. Oktober 2010, 09:26

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
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!?
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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?
Das Leben ist wie ein Tennisball.
funkheld
User
Beiträge: 258
Registriert: Sonntag 31. Oktober 2010, 09:26

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




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.
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

@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.
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.)
funkheld
User
Beiträge: 258
Registriert: Sonntag 31. Oktober 2010, 09:26

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

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.
funkheld
User
Beiträge: 258
Registriert: Sonntag 31. Oktober 2010, 09:26

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
Antworten