Kriegt man damit auch eine *dll hin die man in ein Prozess injiziert, weil eine Uhr zum zocken im Vollbildmodus wäre nicht schlecht. Bevor ich mich weiter mit C++ abstrampel würde ich dann lieber von 0 anfangen und FreeBasic lernen.
![](https://autoit.de/wcf/images/avatars/83/485-8368aa9be857e05d822206ed9e95a1ecd4d316c9.png)
Dll erstellen und mit AutoIt nutzen - FreeBasic Tutorial
-
-
- Offizieller Beitrag
volle
Dll-Injection?! - Du solltest dir dringend unsere Forenregeln durchlesen. Für so etwas gibt es hier keine Unterstützung. -
Kriegt man damit auch eine *dll hin die man in ein Prozess injiziert, weil eine Uhr zum zocken im Vollbildmodus wäre nicht schlecht. Bevor ich mich weiter mit C++ abstrampel würde ich dann lieber von 0 anfangen und FreeBasic lernen.
Kleb dir eine kleine LCD-Uhr oben auf den Bildschirm. Wozu brauchst du da DLL-Injection?
z.B. So was -
Ach vergesst einfach wieder.
-
Bilanz:
Montag - Freitag: Überlegung ob sich der Aufwand lohnt.
Samstag - FB Referenz (deutsch) gelesen.
Sonntag - Lesen, Lesen, Lesen und ... erste primitive DLL geht vom Band.
Montag - Lesen + Beginn an einem kleinen Konsolenspiel (wie nennt man sowas ? Text basierte DOS Spiele^^)
Dienstag - Konsolenspiel weiterentwickeln
Mittwoch - keine Zeit
Donnerstag - Überlegung ob die Kugelgeschichte mit akzeptabelem Aufwand in FB machbar ist.
Freitag (heute) - nach 3 interessanten Stunden voller glücklicher Erlebnisse läuftsFazit:
FB ist sehr schnell in relativ großem Umfang lernbar und Anwendbar.
Man muss seine Skripte etwas anpassen um die Kompatibilität zu erhöhen.
FB gibt relativ selten viele Errors aus. Selbst wenn man mal Klammern vergisst kommt nur eine Warnung. Das Programm läuft idr trotzdem
Print ist in Dlls kompatibel mit der Konsole in SciTE. Zum Fehlersuchen optimal.
Die Ausführungsgeschwindigkeit liegt selbst bei blutigen Basic Anfängern wie mir sehr weit über AutoIt.Danke für das Tut. Auch wenn es nur der Schubs war, nun rollt alles
-
Klasse Implementierung Mars!
Jetzt könnte man die DLL noch einbetten und direkt vom Speicher aufrufen, so dass das Mitgeben der DLL unnötig wird.
Gruß,
UEZ -
Super Tut!
Hab gleich den Einstieg gefunden, gerne mehr zu dem Thema. Vlt. auch mit weiteren Beispielen!
Gruß der Strahleman
-
Hab gleich mal eine Frage:
Wie kann man denn einen selbst definierten type in der erstellten DLL nutzen.
Dieser soll als Rückgabewert einer Funktion in Autoit nutzbar sein.Hab da nämlich versucht die komplexen Zahlen und ihre Rechenregeln in eien DLL zu packen, allerdings komme ich mit den Rückgabewerten nicht klar?!?
der Strahleman
-
Alles was nicht dem Standard entspricht, muss in AutoIt ein Pointer zu einer DLLStruct sein. Am besten ist dann aber auch nicht direkt den Rückgabewert zu verwenden, sondern z.B. den ersten oder letzten Parameter ByRef zu übergeben. Dann hast du auch keine Probleme mit dem 'wer allokiert den Speicher und wer gibt ihn wieder frei'.
-
Danke funkey,
habs jetzt hinbekommen, dass über ByRef die ermittelte Struktur an Autoit übergeben wird. Aber kann ich auch diese erstellten Strukturen wieder von Autoit an die DLL zur Weiterverarbeitung zurückübergeben und eine neu berechnete Struktur dann von der DLL erhalten?
-
Zitat von Strahleman
habs jetzt hinbekommen, dass über ByRef die ermittelte Struktur an Autoit übergeben wird. Aber kann ich auch diese erstellten Strukturen wieder von Autoit an die DLL zur Weiterverarbeitung zurückübergeben und eine neu berechnete Struktur dann von der DLL erhalten?Natürlich kann man das. Einfach Struktur erstellen (DllStructCreate) und den Pointer der Funktion übergeben (DllStructGetPtr).
Und wenn du von einer Funktion einen Pointer erhältst, dann kannst du diesen auch gleich direkt der nächsten Funktion übergeben. -
Das hatte ich mir schon gedacht, allerdings bekomme ich dann immer nur Null-Werte übergeben.
Naja, werde mal noch ein bischen probieren.Danke!
-
Hallo,
und nochmal ich.
Jetzt klappt es. Hab ein ByRef in einer Funktion vergessen.
Merkwürdigerweise funktioniert die Rückübergabe bei allen erstellten einparametrigen Type-Varianten (inkl. Double) und bei allen mehrparametrigen Type-Varianten wenn kein Double verwendet wird.
Allerdings würde ich gerne mit einem vier-parametrigen Type aus Double arbeiten.Hiermal der Beispiel-Code.
Der Aufruf in Autoit:Spoiler anzeigen
[autoit]
[/autoit] [autoit][/autoit] [autoit]
$hDll = DllOpen($strdll)$a = DllStructCreate("double;double;double;double")
[/autoit] [autoit][/autoit] [autoit]
$ptrA = DllStructGetPtr($a)
$arrPtrA = DllCall($hDll, "Ptr", "f_inTest", "double", 1,"double", 2,"double", 3,"double", 4, "ptr", $ptrA)$b = DllStructCreate("double;double;double;double")
[/autoit] [autoit][/autoit] [autoit]
$ptrB = DllStructGetPtr($b)
$arrPtrB = DllCall($hDll, "Ptr", "f_Test", "ptr", $ptrA, "ptr", $ptrB)DllClose($hDll)
[/autoit]
Die entsprechende DLL:Spoiler anzeigen
Code
Alles anzeigenExtern "Windows-MS" Type testtype x1 As Double x2 As Double x3 As Double x4 As Double End Type Function f_inTest(ByVal y1 As Double, ByVal y2 As Double, ByVal y3 As Double, ByVal y4 As Double, z As testtype) As testtype Export z.x1 = y1 + 1 z.x2 = y2 + 1 z.x3 = y3 + 1 z.x4 = y4 + 1 Return z End Function Function f_Test(ByRef z1 As testtype, ByRef z2 As testtype) As testtype Export z2.x1 = z1.x1 - 1 z2.x2 = z1.x2 - 1 z2.x3 = z1.x3 - 1 z2.x4 = z1.x4 - 1 Return z2 End Function End Extern
Wie gesagt, wenn ich beispielsweise vier byte-Typen verwende funktioniert diese Variante, nur eben nicht bei der Version wie oben mit den Double-Typen ?!?
Ich hoffe jemand kann mir auf die Sprünge helfen! -
Ich hätte das so gemacht:
AutoIt
[autoit]Global $strdll = "Freebasic_DLL.dll"
[/autoit] [autoit][/autoit] [autoit]$hDll = DllOpen($strdll)
[/autoit] [autoit][/autoit] [autoit]$a = DllStructCreate("double;double;double;double")
[/autoit] [autoit][/autoit] [autoit]$ptrA = DllStructGetPtr($a)
[/autoit] [autoit][/autoit] [autoit]
$aRet= DllCall($hDll, "none", "f_inTest", "double", 1,"double", 2,"double", 3,"double", 4, "ptr", $ptrA)ConsoleWrite(DllStructGetData($a, 1) & @CRLF)
[/autoit] [autoit][/autoit] [autoit]
ConsoleWrite(DllStructGetData($a, 2) & @CRLF)
ConsoleWrite(DllStructGetData($a, 3) & @CRLF)
ConsoleWrite(DllStructGetData($a, 4) & @CRLF)$b = DllStructCreate("double;double;double;double")
[/autoit] [autoit][/autoit] [autoit]
$ptrB = DllStructGetPtr($b)
$arrPtrB = DllCall($hDll, "none", "f_Test", "ptr", $ptrA, "ptr", $ptrB)ConsoleWrite(DllStructGetData($b, 1) & @CRLF)
[/autoit] [autoit][/autoit] [autoit]
ConsoleWrite(DllStructGetData($b, 2) & @CRLF)
ConsoleWrite(DllStructGetData($b, 3) & @CRLF)
ConsoleWrite(DllStructGetData($b, 4) & @CRLF)DllClose($hDll)
[/autoit]Freebasic_DLL
Code
Alles anzeigenExtern "Windows-MS" TYPE testtype x1 AS DOUBLE x2 AS DOUBLE x3 AS DOUBLE x4 AS DOUBLE END TYPE SUB f_inTest(BYVAL y1 AS DOUBLE, BYVAL y2 AS DOUBLE, BYVAL y3 AS DOUBLE, BYVAL y4 AS DOUBLE, ByRef z AS testtype) Export z.x1 = y1 + 1 z.x2 = y2 + 1 z.x3 = y3 + 1 z.x4 = y4 + 1 'RETURN z END Sub SUB f_Test(BYREF z1 AS testtype, BYREF z2 AS testtype) Export z2.x1 = z1.x1 - 1 z2.x2 = z1.x2 - 1 z2.x3 = z1.x3 - 1 z2.x4 = z1.x4 - 1 'RETURN z2 END Sub END Extern
-
funkey Danke funktioniert!
-
Das das so funktioniert, hab ich gar nicht gewusst
Dennoch ist es einfacher ohne ByRef zu arbeiten und in FB die Pointerschreibweise zu benutzen, dann behält man besser den Überblick - zumindest ich
Code
Alles anzeigenType testtype x1 AS DOUBLE x2 AS DOUBLE x3 AS DOUBLE x4 AS DOUBLE END Type Extern "Windows-MS" SUB f_inTest(BYVAL y1 AS DOUBLE, BYVAL y2 AS DOUBLE, BYVAL y3 AS DOUBLE, BYVAL y4 AS DOUBLE, ByVal z AS testtype Ptr) Export z->x1 = y1 + 1 z->x2 = y2 + 1 z->x3 = y3 + 1 z->x4 = y4 + 1 'RETURN z END Sub SUB f_Test(ByVal z1 As testtype Ptr, ByVal z2 AS testtype Ptr) Export z2->x1 = z1->x1 - 1 z2->x2 = z1->x2 - 1 z2->x3 = z1->x3 - 1 z2->x4 = z1->x4 - 1 'RETURN z2 END Sub END Extern
-
In AutoIt geht es übrigens auch so:
[autoit]
[/autoit][autoit][/autoit][autoit]
$a = DllStructCreate("double;double;double;double")$aRet= DllCall($hDll, "none", "f_inTest", "double", 1,"double", 2,"double", 3,"double", 4, "struct*", $a)
[/autoit] -
Vielen Dank für das Tutorial! Kann man sehr gut brauchen und hab ich ehrlich gesagt auch schon öfters erfolglos versucht
Danke! -
Danke progandy für die Erinnerung, das vergesse ich immer wieder.
-
Update im ersten Post
und zwar ein Multithreading-Beispiel für Fortgeschrittene
Die Sourcecodes und die vorkomilierten Dll´s sind im Anhang in GreyScale.zip
E
-