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: 224
Registriert: Sonntag 31. Oktober 2010, 09:26

Mittwoch 17. November 2010, 13:25

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: 5461
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Mittwoch 17. November 2010, 14:05

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?
shcol (Repo | Doc | PyPi)
funkheld
User
Beiträge: 224
Registriert: Sonntag 31. Oktober 2010, 09:26

Mittwoch 17. November 2010, 14:11

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: 5461
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Mittwoch 17. November 2010, 14:19

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

Mittwoch 17. November 2010, 14:25

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

Mittwoch 17. November 2010, 14:36

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: 5461
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Mittwoch 17. November 2010, 14:42

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

Mittwoch 17. November 2010, 14:54

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

Mittwoch 17. November 2010, 15:14

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

Mittwoch 17. November 2010, 15:33

@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: 224
Registriert: Sonntag 31. Oktober 2010, 09:26

Mittwoch 17. November 2010, 18:15

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

Mittwoch 17. November 2010, 19:06

@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: 4871
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Mittwoch 17. November 2010, 19:14

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: 224
Registriert: Sonntag 31. Oktober 2010, 09:26

Mittwoch 17. November 2010, 19:47

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

Mittwoch 17. November 2010, 20:11

@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.
Antworten