Navigation: Platzhalter und Variablen > Platzhalter Pro-Lizenz > Platzhalter: System >

DLL-Aufrufe

Diese Seite drucken
Vorherige Seite Nächste Seite
Zurück zur Kapitelübersicht

Der Platzhalter [System.DLLAufruf X] ermöglicht den direkten Aufruf von Funktionen aus Win32-DLLs (DLL = Dynamic Link Library) und die Auswertung des Rückgabewertes.

Für diesen Aufruf können zudem mit [System.DLLSignatur] Funktionsaufrufe als Signatur vordefiniert werden (s.u.).

 

Als Parameter für [System.DLLAufruf] werden folgende Daten angegeben, getrennt durch Semikolons:

DLL-Name; Funktionsname; Parameter1; ...; ParameterN

 

DLL-NameName der DLL im Suchpfad, wobei die Endung DLL auch weggelassen werden kann. Liegt die gefragte DLL nicht in einem Ordner, in dem Windows sie automatisch findet, muss der gesamte Pfad der DLL angegeben werden.
FunktionsnameName der aufzurufenden Funktion in der DLL.
Hinweis: da Textparameter als ANSI-Strings übergeben werden, muss bei einigen Funktionen der Windows-System-DLLs die ANSI-Version der Funktion verwendet werden, welche dann mit einem A endet (siehe Beispiele unten)
ParameterZu übergebende Parameter (optional)
Folgende Parametertypen stehen zur Verfügung:
"Parameter"     ANSI-String
Parameter        LONG-Wert (32 Bit)
Parameter%     INTEGER-Wert (16 Bit)
Parameter!       Byte-Wert (8 Bit ohne Vorzeichen)
Parameter?      Binärdaten (primär für [Struktur.X]-Platzhalter)
So wie hier angegeben werden die Parameter als Wert übergeben. Erfordert die DLL die Übergabe eines Parameters als Referenz (Zeiger auf den Wert), so wird dies durch ein vorangesetztes =-Zeichen angegeben. Vor diesem Zeichen kann noch ein Variablenname stehen (ohne []), wodurch der Inhalt des Parameters nach Ausführung der DLL-Funktion in die angegebene Variable kopiert wird.
Ein Sonderfall ist die Übergabe von Strings als Referenz. Da viele DLL-Funktionen ein Ergebnis in einen solchen String eintragen, muss er bereits vor dem Aufruf eine entsprechende Länge aufweisen. Hierzu kann entweder ein bereits im Skript vorbereiteter String per =[Puffer] oder ein von cX vorzubereitender Leerstring übergeben werden, welcher als Zahl mit folgendem $-Zeichen angegeben wird. Beispielsweise bewirkt die Angabe von Rückgabevariable=100$, dass ein Leerstring von 100 Zeichen angelegt, an die DLL-Funktion übergeben und das Ergebnis aus diesem String in die Variable [Rückgabevariable] eingetragen wird.
Hinweis: Es kann auch ein Zeiger auf eine Datenstruktur übergeben werden, die zuvor mit [Struktur(ID).X] deklariert und gefüllt wurde, falls die DLL-Funktion einen solchen Parameter erfordert.

 

Hinweis: Da beim Aufruf einer DLL-Funktion die Kontrolle komplett abgegeben wird, muss dieser unbedingt mit den korrekten Parametern versehen sein. Eine Überprüfung der Parameter ist für click.EXE nicht möglich, da die Anforderungen der DLL-Funktion nicht bekannt sein können. Bei einer falschen Parameterübergabe ist ein Absturz möglich!

 

 

Beispiele:

 

***  Fenster 1x blinken lassen
Setze  in [Ergebnis]:  '[System.DLLAufruf user32;  FlashWindow; [Anzeige.Nummer]; 1]'

 

Die Funktion FlashWindow aus der System-DLL user32.dll wird mit den Parametern [Anzeige.Nummer] (Fensterhandle des Anzeigefensters) und 1 (Anzahl der Blinkvorgänge) aufgerufen: Das Fenster blinkt 1x. Der Ergebniswert der Funktion wird in [Ergebnis] eingetragen.

 

 

***  neuen Titel setzen
Setze  in [NeuerTitel]:  'Hallo, Welt!'
Setze  in [Ergebnis]:  '[System.DLLAufruf user32; SetWindowTextA; [Anzeige.Nummer]; "[NeuerTitel]"]'

 

Die Funktion SetWindowTextA (ANSI-Version von SetWindowText) aus der System-DLL user32.dll wird mit den Parametern [Anzeige.Nummer] (Fensterhandle des Anzeigefensters) und dem Text in der Variablen [NeuerTitel] aufgerufen. Das Anzeigefenster zeigt danach den neuen Text in der Titelzeile an.

 

 

***  Fenstertitel abfragen
***  [AlterTitelLänge]=Länge des ermittelten Titels, [AlterTitel]=Ergebnis (max. 100 Zeichen lang)
Setze  in [AlterTitelLänge]:  '[System.DLLAufruf user32; GetWindowTextA;[Anzeige.Nummer]; AlterTitel=100$;100]'
Meldung  "Alter Titel: [AlterTitel]¶Länge: [AlterTitelLänge]" (Titel: 'Fenster', 'OK, Abbrechen')

 

Die Funktion GetWindowTextA (ANSI-Version von GetWindowText) aus der System-DLL user32.dll wird mit den Parametern [Anzeige.Nummer] (Fensterhandle des Anzeigefensters), einem Leerstring von 100 Zeichen Länge und der 100 als LONG-Wert (Größe des übergebenen Stringpuffers) aufgerufen. Nach dem Aufruf wird der von der Funktion veränderte Puffer in die Variable [AlterTitel] zurückgeschrieben. Der Ergebniswert der Funktion wird in [AlterTitelLänge] eingetragen.

 

 

***  Usernamen ermitteln
***  [Ergebnis]<>0 bei Erfolg, [UserName]= Ergebnis, [NeueLänge]=Länge incl. 0-Zeichen am Ende
Setze  in [Ergebnis]:  '[System.DLLAufruf advapi32; GetUserNameA;UserName="Kein Benutzer angemeldet!";NeueLänge=25]'
Meldung  "Username: [UserName]¶Länge: [NeueLänge]¶" (Titel: 'Username', 'OK, Abbrechen')

 

Die Funktion GetUserNameA (ANSI-Version von GetUserName) aus der System-DLL advapi32.dll wird mit dem vorgegebenen String sowie der 25 als LONG-Wert (Größe des übergebenen Stringpuffers) aufgerufen. Nach dem Aufruf wird der von der Funktion veränderte Puffer in die Variable [UserName] zurückgeschrieben. Sollte die Funktion scheitern, wird der vorgegebene Text zurückgegeben. Die Länge des Ergebnisstrings wird von der DLL-Funktion in die Variable [NeueLänge] zurückgeschrieben. Der Ergebniswert der Funktion wird in [Ergebnis] eingetragen.

 

Hier der cX2Web-Code für die oben gezeigten Beispiele:

**cX401436 BC162BS214 1CMQkwCQkg RmVuc3Rlcn RpdGVsIGFi ZnJhZ2VuIH

VuZCBuZXUg c2V0emVuDQ ozOQkwCQkg RmVuc3Rlcn RpdGVsCUMN CjAJMAkNCj

EJMAkJIEZl bnN0ZXJ0aX RlbCBhYmZy YWdlbg0KMQ kwCQkgW0Fs dGVyVGl0ZW

xM5G5nZV09 TORuZ2UgZG VzIGVybWl0 dGVsdGVuIF RpdGVscywg W0FsdGVyVG

l0ZWxdPUVy Z2VibmlzIC htYXguIDEw MCBaZWljaG VuIGxhbmcp DQoyMgkwCQ

k9QWx0ZXJU aXRlbEzkbm dlCSBbU3lz dGVtLkRMTE F1ZnJ1ZiB1 c2VyMzI7IE

dldFdpbmRv d1RleHRBO1 tBbnplaWdl Lk51bW1lcl 07IEFsdGVy VGl0ZWw9MT

AwJDsxMDBd DQozCTAJCS BBbHRlciBU aXRlbDogW0 FsdGVyVGl0 ZWxdtkzkbm

dlOiBbQWx0 ZXJUaXRlbE zkbmdlXQlU RmVuc3Rlcg lNNjQJQjEN CjAJMAkNCj

EJMAkJIG5l dWVuIFRpdG VsIHNldHpl bg0KMjIJMA kJPU5ldWVy VGl0ZWwJIE

hhbGxvLCBX ZWx0IQ0KMj IJMAkJPUVy Z2VibmlzCS BbU3lzdGVt LkRMTEF1Zn

J1ZiB1c2Vy MzI7IFNldF dpbmRvd1Rl eHRBOyBbQW 56ZWlnZS5O dW1tZXJdOy

AiW05ldWVy VGl0ZWxdIl 0NCjAJMAkN CjEJMAkJIE ZlbnN0ZXIg MXggYmxpbm

tlbiBsYXNz ZW4NCjIyCT AJCT1Fcmdl Ym5pcwkgW1 N5c3RlbS5E TExBdWZydW

YgdXNlcjMy OyAgRmxhc2 hXaW5kb3c7 IFtBbnplaW dlLk51bW1l cl07IDFdDQ

owCTAJDQow CTAJDQoxCT AJCSBVc2Vy bmFtZW4gZX JtaXR0ZWxu DQoxCTAJCS

BbRXJnZWJu aXNdPD4wIG JlaSBFcmZv bGcsIFtVc2 VyTmFtZV09 IEVyZ2Vibm

lzLCBbTmV1 ZUzkbmdlXT 1M5G5nZSBp bmNsLiAwLV plaWNoZW4g YW0gRW5kZQ

0KMjIJMAkJ PUVyZ2Vibm lzCSBbU3lz dGVtLkRMTE F1ZnJ1ZiBh ZHZhcGkzMj

sgR2V0VXNl ck5hbWVBO1 VzZXJOYW1l PSJWb3JiZW xlZ3VuZyEi O05ldWVM5G

5nZT0yMF0N CjMJMAkJIF VzZXJuYW1l OiBbVXNlck 5hbWVdtkzk bmdlOiBbTm

V1ZUzkbmdl XbYJVFVzZX JuYW1lCU02 NAlCMQ0K=*

 

 

Signaturen definieren

Mit dem Platzhalter [System.DLLSignatur] ist es möglich, die Signaturen von DLL-Funktionen vorzudefinieren, also deren DLL- und Funktionsname sowie die Parameter vorzugeben. Beim Aufruf einer so definierten Funktion braucht dann nur der bei der Signatur vorgegebene Name in Klammern sowie die Parameterwerte angegeben werden, die unbedingt notwendig für den Aufruf sind. In der Signatur vordefinierte Parameter können beim Aufruf also auch weggelassen werden, wodurch die Vorgabewerte der Signatur verwendet werden.

Diese Technik ermöglicht somit die Bildung einer Art Funktionsbibliothek mit den Signaturen der verschiedensten DLL-Funktionen, deren Aufruf dann nicht nur sehr einfach, sondern auch deutlich sicherer ist, da fehlerhafte Parameterangaben weitgehend ausgeschlossen werden.

 

Als Beispiel kann so die DLL-Funktion GetUserNameA aus der DLL advapi32.dll folgendermaßen vordefiniert und aufgerufen werden:

***  Signatur definieren (Parameter "Name=Wert", "=Wert" für Referenzübergabe oder nur "Wert" für Wertübergabe)

  Setze  in [System.DLLSignatur(BenutzernamenHolen)]:  'advapi32; GetUserNameA;UserName=100$;MaxLänge=100'

 

***  DLL-Aufruf der als Signatur vordefinierten Funktion

  Setze  in [Ergebnis]:  '[System.DLLAufruf(BenutzernamenHolen) UserName]'

Beim Aufruf selbst wird hier lediglich der Variablenname UserName angegeben und von der Funktion mit dem Namen des aktuellen Windows-Benutzers gefüllt. Die für den DLL-Aufruf notwendige Längenangabe wird von der Signatur selbst definiert und kann daher weggelassen werden, sofern nicht ein anderer Variablenname oder Wert gewünscht wird.

 

 

 


cX-Webseite: http://www.clickexe.de