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 [cX.System.DLLAufruf X] ermöglicht unter Windows den direkten Aufruf von Funktionen aus Win32-DLLs (DLL = Dynamic Link Library) und die Auswertung des Rückgabewertes.

 

Als Parameter für [cX.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
So wie hier angegeben werden die Parameter (außer Strings) als Wert übergeben.
 
Ein Sonderfall ist die Übergabe von Texten (Strings) als Referenz (Zeiger auf den Speicher mit dem Text):
Erfordert die DLL die Übergabe eines String-Parameters als Referenz, 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.
Da diese DLL-Funktionen ein Ergebnis in den Speicherbereich eines solchen Strings 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 (optional) das Ergebnis aus diesem String in die Variable [Rückgabevariable] eingetragen wird.
Bei Ein-/Ausgabewerten (Int32) kann ebenfalls Variablenname=Wert angegeben werden, wobei Wert an die Funktion übergeben und in [Variablenname] der von der Funktion zurückgeschriebene Wert geliefert wird.
Hinweis: Bei Windows-Systemaufrufen muss stets die ANSI-Variante der jeweiligen Funktion (xxxA) verwendet werden!

 

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!

 

Hinweis: Funktionen aus .NET-Assemblies können mit dem OLEObjekt-Befehl aufgerufen werden.

 

 

Beispiele:

 

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

 

Die Funktion FlashWindow aus der System-DLL user32.dll wird mit den Parametern [cX.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]:  '[cX.System.DLLAufruf(user32; SetWindowTextA; [cX.Anzeige.Nummer]; "[NeuerTitel]")]'

 

Die Funktion SetWindowTextA (ANSI-Version von SetWindowText) aus der System-DLL user32.dll wird mit den Parametern [cX.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]:  '[cX.System.DLLAufruf(user32; GetWindowTextA;[cX.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 [cX.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]:  '[cX.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.

 

Signaturen definieren

Mit dem Platzhalter [cX.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 [cX.System.DLLSignatur(BenutzernamenHolen)]:  'advapi32; GetUserNameA;UserName=100$;MaxLänge=100'

 

***  DLL-Aufruf der als Signatur vordefinierten Funktion

Setze in [Rückgabe]: '[cX.System.DLLAufruf(BenutzernamenHolen)]' 

Meldung 'Ergebnis: [Rückgabe]¶Username: [Username]¶Länge: [Länge]', Titel 'Benutzername (Signatur)'

Beim Aufruf selbst werden hier die Variablen UserName und MaxLänge von der Funktion mit dem Namen des aktuellen Windows-Benutzers und dessen Länge gefüllt. Die für den DLL-Aufruf notwendigen vorbereiteten Parameter werden von der Signatur selbst definiert und kann daher weggelassen werden, sofern nicht ein anderer Variablenname oder Wert gewünscht wird.

 

 


 

OLEObjekt-Befehl

 

 


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