[AutoIt] Dll in AutoIt - Teil 1

01/31/2010 11:58 HardCore.1337#1
Herzlich Wilkommen zu Teil1 meines Dll Tutorial.
In dieser Reihe werde ich euch ganz genau erklären wie ihr mit Dll´s umzugehen habt und ihr sie am besten nutzt um maximale Erfolge zu erlangen.



Im Teil 1 werden wir folgendes behandeln

  • Was ist eine Dll
  • Grundlagen bei Dll´s in AutoIt
  • Schreiben der Dll
  • Benutzen der DLL

Ok, legen wir los.



Was ist eine DLL?

Dll bedeutet ausgeschrieben "Dynamic Link Libray", oder auch Dynamische Link Bibliothek. Darunter versteht man folgens, das eine DLL eine Ansammlung von Funktionen hat, die Dynamisch aufgerufen werden kann. DLL gibt es allerdings nur unter Windows, andere Betriebssysteme benutzen ähnliche Varianten.

Zitat aus Wikipedia:

Quote:
Der Zweck von DLL-Dateien ist, den von einer Anwendung auf der Festplatte und im Hauptspeicher benötigten Speicherplatz zu reduzieren. Jeglicher Programmcode, der von mehr als einer Anwendung benötigt werden könnte, wird deshalb in einer einzelnen Datei auf der Festplatte gespeichert und nur einmal in den Hauptspeicher geladen, wenn mehrere Programme dieselbe Programmbibliothek benötigen.
Das heißt, wenn die DLL einmal im Speicher ist, dann sie von jedem Programm benutzt werden.



Pro und Contra

Pro
  1. Dll´s können in Form von PlugIn´s dienen
  2. verbrauchen wenig Speicher, weil sie nur einmal geladen werden müssen

Contra
  1. Kommt zu Problemen, wenn mehrere Anwednungen verschiedene Versionen benötigen
  2. Bei NET Anwendungen kommt es auch manchmal zu Konflikten


Grundlagen von DLL´s in AutoIt
  • Als Aufruf Konvention beutzt AutoIt die Win API Methode "stdcall"
  • Man sollte immer voher "DllOpen nutzen", wenn man eine DLL öffnet.

Bei einem einfachen Einsatzt,wie er hier Erläutert wird, gibt es noch nix besonderes zu beachten. Später wird sich das allerdings ändern, was aber noch genauer Erklärt wird.


Schreiben der DLL

Damit dies auch eine Tutorial wird, wollen wir natürlich auch eine DLL einsetzen. Der größte Nachteil ist sicher der, das man in AutoIt keine eigenen Dll´s schreiben kann, sondern sich entweder selber eine erstellen oder auf fremde Quellen zurück greifen. Für alle die, die in der Lage sind eine zu schreiben, sollen jetzt eine schreiben. Ich benutze Delphi dafür. Aber ihr könnt natürlich auch C++, VB usw. nutzen. Wichtig ist nur das ihr die Aufruf Konvention "stdcall" benutzt.

Also, für alle die es auch in Delphi machen.
  • Öffnet ein neues DLL Projekt
  • Fügt in die uses Klausel "Windows" ein
  • gebt nun folgenden Code ein

Code:
library Rechnung;


uses
  SysUtils,
  Windows,
  Classes;

{$R *.res}

Function Rechnen (Zahl1, Zahl2: Double): Double; stdcall;
begin
  result := Sqrt((Zahl1*Zahl2));
end;

exports
  Rechnen index 1;

begin
end.
Was macht die DLL jetzt? Sie errechnet aus dem Produkt zweier Zahlen die Wurzel.
Als Parameter erwartet sie zwei Zahlen vom Typ double.
Speichert jetzt die DLL in einem beliebigen Ordner. In diesen Ordner erstellen wir später auch noch unsere AutoIt Datei.



Benutzen der DLL

Öffnet nu als erstes AutoIt.
Jetzt machen wir erstmal ein paar vorüberlegungen.
Was wollen wir uns was brauchen wir.

Wir brauchen
  • 2 Zahlen vom Typ double
  • den DLL Namen und den Speicherpfad
  • Den Return Typ

Was wollen wir?
  • Die Wurzel aus dem Produkt der beiden Zahlen

OK, uns ist alles bekannt. Der Pfad, die Parameter usw.
Legen wir los

Als erstes Öffnen wir die DLL. Das erledigen wir mit "DLLOpen". Diesen Wert speichern wir in einer Variable.

PHP Code:
$Open DllOpen("Rechnung.dll"
Jetzt geht es darum, die Funktion zu callen.
Dafür steht uns die Funktion "DllCall" zur Verfügung. Der Syntax sieht dafür wie folgt aus.

Code:
DllCall ( "dll", "return type", "function" [, "type1" [, param1 [, "type n" [, param n]]]] )
Und das setzen wir jetzt ein.
Den return Wert speichern wir wieder in einer Variable.

PHP Code:
$return DllCall ($Open"double""Rechnen""double"20"double"
So, für Zahl1 und Zahl2 haben wir nun Probeweise 20 eingesetzt.

Erinnern wir uns an unsere Dll.

Rechnen (Zahl1, Zahl2: Double): Double;

->

Unsere erwarteten Zahlen (im beispiel hier der Wert 20)

Der Typ, den die Zahlen haben müssen (hier double)

Der RückgabeWert (auch double)

nochmal in AutoIt.

DllCall ($Open, "double", "rechnen", "double", 20, "double", 20)


So, nun wollen wir ja aber das Ergebnis wissen.

Wichtig
AutoIt speichert den Rückgabewert in einem Array. Standart ist es der 0

Aufrufen geht wie gewohnt.
PHP Code:
MsgBox (64"Ergebnis""Das Ergebnis lautet " & return[0]) 
Demnach sieht unser Code nun wie folgt aus und sollte auch funktionieren.

PHP Code:
$Open DllOpen("Rechnung.dll")
$return DllCall ($Open"double""Rechnen""double",20"double"20)
    
MsgBox (64"Ergebnis""Das Ergebnis lautet " $return[0]) 
Wenn ihr es nun mit F5 startet sollte eine MsgBox mit dem Wert "20" rauskommen.


Eigene Werte

Eigene Werte einzutragen ist ganz einfach. Erstellt dafür eine GUI oder nehmt die Vorlage von meiner.
PHP Code:
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#Region ### START Koda GUI section ### Form=
$Form1 GUICreate("Wurzelrechnung"154182192124)
$Label1 GUICtrlCreateLabel("Deine Erste Zahl:"162410620)
GUICtrlSetFont(-1104000"MS Sans Serif")
$Label2 GUICtrlCreateLabel("Deine Erste Zahl:"168810620)
GUICtrlSetFont(-1104000"MS Sans Serif")
$Input1 GUICtrlCreateInput(""164812121)
$Input2 GUICtrlCreateInput(""1611212121)
$Button1 GUICtrlCreateButton("Rechnen"1614412325$WS_GROUP)
GUICtrlSetFont(-1104000"MS Sans Serif")
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

While 1
    $nMsg 
GUIGetMsg()
    Switch 
$nMsg
        
Case $GUI_EVENT_CLOSE
            
Exit
        Case 
$Button1
            _Rechnen
()

    EndSwitch
WEnd 
So, sieht die etwa aus:

[Only registered and activated users can see links. Click Here To Register...]

So, und jetzt einfach arbeiten wie man es mit GUI´s gewohnt ist.
Wenn man auf den Button klickt, wird die Funktion rechnen aufgerufen.

PHP Code:
While 1
    $nMsg 
GUIGetMsg()
    Switch 
$nMsg
        
Case $GUI_EVENT_CLOSE
            
Exit
        Case 
$Button1
            _Rechnen
()

    EndSwitch
WEnd 
In die Funktion kommen noch alles rein was wir bis jetzt geschrieben haben und noch 2 Variablen, die den Wert aus den beiden InputBoxen auslesen.


PHP Code:
Func _Rechnen()
  GLobal 
$Zahlx GUICtrlRead($Input1)
  Global 
$Zahly GuiCtrlRead($Input2)
  
$Open DllOpen("Rechnung.dll")
  
$return DllCall ($Open"double""Rechnen""double"$Zahlx"double"$Zahly)
    
MsgBox (64"Ergebnis""Das Ergebnis lautet " $return[0])
EndFunc 
Jetzt noch schnell einen Wert in der DllCall ändern und dann sind wir fertig.
Entfernt die "20" und schreibt $Zahlx und $Zahly rein. Nun könnt ihr eure eigenen Werte eintragen berechnen lassen.

So, das war der erste Teil meines Tutorials. Der zweite Teil folgt bald.

Wenn es euch gefalle hat, drückt doch bitten den [Only registered and activated users can see links. Click Here To Register...] Button. Danke!
01/31/2010 12:09 .nAno#2
thx, 1.) weil du dir die Mühe gemacht hast mir das zuvor persönlich beizubringen ;) und 2.)
weil sowas noch gefehlt hat^^

ich hoff nur ich find bald nen Assembler für Java o0
01/31/2010 12:10 Shadowz75#3
Du solltest noch dazu schreiben, dass man mit AutoIt keine Managed(.Net) Dlls aufrufen kann, da sie Managed Code erzeugen
01/31/2010 16:47 HardCore.1337#4
Video wurde hinzugefügt
02/01/2010 18:34 ax5#5
A Good tip for you [Only registered and activated users can see links. Click Here To Register...] add subtitles to your video so people that is not German can see and understand it :)


Have a nice day :)
02/01/2010 18:50 HardCore.1337#6
My English is not the best :o
The tutorial in English would be bad :mofo:
02/01/2010 18:56 ax5#7
Quote:
Originally Posted by General Desert View Post
My English is not the best :o
The tutorial in English would be bad :mofo:
I Recommend you to try and use [Only registered and activated users can see links. Click Here To Register...]

:):):):):)
02/01/2010 18:57 HardCore.1337#8
Google Translator is buggy.
02/21/2010 19:45 super47#9
hallo
was soll das ding rechnen?
beide eingabefelder "deine erste Zahl ?"
in der form steht was mit wurzel?

danke
gruss roland_k
02/21/2010 20:06 ax5#10
Quote:
Originally Posted by General Desert View Post
Google Translator is buggy.
Lol try it man more people will like to understand this video :mofo:
02/21/2010 20:51 Waynee#11
google translate is rubbish ^.^

it is doing so mutch faults while translating
it is worser as my english ;D
02/21/2010 21:31 Ende!#12
Schönes Tutorial, gut verständlich, danke ^^
02/21/2010 21:32 ax5#13
Quote:
Originally Posted by Waynee View Post
google translate is rubbish ^.^

it is doing so mutch faults while translating
it is worser as my english ;D
hehe thats true :mofo:
02/21/2010 23:52 LordKill#14
nettes tutorial, habe nun mit c++ angefangen und werde demnächst paar dlls machen und sie vorerst mit autoit nutzen ;)
1000. post =O
02/22/2010 21:39 HardCore.1337#15
Quote:
hallo
was soll das ding rechnen?
beide eingabefelder "deine erste Zahl ?"
in der form steht was mit wurzel?

danke
gruss roland_k
mein fehler. Das zweite Eingabe Feld soll folgich "...bitte zweite Zahl" heißen.
Also nochmal verständlich.
Man gibt 2 Zahlen ein. Diese werden dann multipliziert und aus dem produkt wird die Wurzel gebildet