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-Name | Name 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. |
Funktionsname | Name 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) |
Parameter | Zu ü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.
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.
cX-Webseite: http://www.clickexe.net