|
Typ |
Details |
|
none |
kein Wert
(nur gültig für Rückgabetyp - entspricht void in C) |
|
byte |
ein 8 Bit
integer |
|
ubyte |
ein unsigned
8 Bit integer |
|
short |
ein 16 Bit
integer |
|
ushort |
ein unsigned
16 Bit integer |
|
dword |
ein unsigned
32 Bit integer |
|
udword |
ein unsigned
32 Bit integer |
|
int |
ein 32 Bit
integer |
|
uint |
ein unsigned
32 Bit integer |
|
long |
ein 32 Bit
integer |
|
ulong |
ein unsigned
32 Bit integer |
|
int64 |
ein 64 Bit
integer |
|
uint64 |
ein unsigned
64 Bit integer |
|
str |
ein ANSI
String (max. 65536 Zeichen). |
|
wstr |
ein UNICODE
wide character String (konvertiert zu/von einem ANSI String während des
Aufrufs, wenn benötigt). Max.
65536 Zeichen. |
|
hwnd |
ein Fenster
Handle (Pointer) |
|
ptr |
ein
allgemeiner Pointer (void *) |
|
float |
eine
Kommazahl einfacher Genauigkeit |
|
double |
eine
Kommazahl doppelter Genauigkeit |
|
lresult/int_ptr/long_ptr |
ein Integer,
groß genug um einen Pointer zu speichern, wenn eine x86 oder x64
Versions von AutoIt läuft |
|
lparam/int_ptr/long_ptr |
ein Integer,
groß genug um einen Pointer zu speichern, wenn eine x86 oder x64
Versions von AutoIt läuft |
|
wparam/uint_ptr/ulong_ptr |
ein unsigned
Integer, groß genug um einen Pointer zu speichern, wenn eine x86 oder
x64 Versions von AutoIt läuft |
|
* |
Füge * an das
Ende eines anderen Typs um ihn ByRef zu erstellen. Z.B.: "int*"
erstellt einen Pointer zu einem "int" Typ. |
|
WINDOWS API Type |
AutoIt Type |
|
LPCSTR/LPSTR |
str |
|
LPCWSTR/LPWSTR |
wstr |
|
LPVOID |
ptr |
|
HWND |
hwnd |
|
WPARAM |
wparam |
|
LPARAM |
lparam |
|
DWORD |
dword |
|
LPDWORD |
dword* |
|
HANDLE/HINSTANCE |
ptr |
|
LONGLONG/LARGE_INTEGER |
int64 |
|
ULONGLONG/ULARGE_INTEGER |
uint64 |
|
UINT_PTR |
wparam |
|
LONG_PTR |
lparam |
Eigentlich
fehlen noch 2 Typen:
Für ANSI-Zeichen "char" und für UNICODE
"wchar". Wir finden diese aber in der Auflistung der Strukturdatentypen.
Beide Typen
repräsentieren 1 einzelnes Zeichen. Wie
lassen sich damit aber Zeichenketten darstellen? Dazu definiert man ein
Array
von Zeichen (z.B. char[20]). Wichtig bei der
Verwendung von UNICODE: Zeichenketten werden dort NULL-terminiert, d.h.
nach
den Zeichen des Strings folgt der ASCII-Wert 0 um anzuzeigen, dass hier
der
String endet. Somit muss die Anzahl von "wchar" um 1 größer sein als
die Stringlänge. Wenn in der
Funktionsbeschreibung angegeben wird, dass der String nullterminiert
ist, gilt
das ebenso bei ANSI.
Allerdings
erleichtert uns AutoIt die Verwaltung dieser beiden Typen durch
Verwendung von
"str" und "wstr".
Da erst ab
Windows 2000 volle UNICODE Unterstützung existiert, sind fast alle
Stringfunktionen mit ANSI- und UNICODE- Version ausgestattet. Sie
werden
unterschieden durch den Zusatz "A" für ANSI-Funktion und
"W" (wide char) für UNICODE-Funktion. Also
"StringFunktionA" und "StringFunktionW".
Wenn
ihr nicht gerade für Win98 programmiert (ha-ha), macht es eigentlich
auch keinen Sinn, die ANSI-Varianten der Funktionen zu verwenden. Mein
Tipp: Setzt, wenn möglich immer die UNICODE-Variante ein.
Wenn wir mit Dll arbeiten wollen, müssen wir auch
über Strukturen reden.
Was also ist eine Struktur?
Eine Struktur weist Ähnlichkeit mit einem Array auf. D.h., unter einem
Variablennamen werden 1 oder mehrere Werte gespeichert.
Was sind die Unterschiede?
Im Array ist es egal, was für Datentypen die einzelnen Werte haben. Sie
können dort auch ständig wechseln. Die Anzahl der Element in einem
Array ist niemals fix, mit ReDim läßt sich die Größe zur Laufzeit
ändern.
Ganz anders die Struktur. Hier bestimme ich beim Erstellen der
Struktur, welche Datentypen die Inhalte haben dürfen. Das ist wichtig,
da in den Dll-Funktionen genau festgelegt ist, welche Datentypen an
welcher Position erwartet werden. Die Anzahl der Strukturelemente kann
zur Laufzeit nicht verändert werden.
AutoIt hat schon eine Vielzahl von Strukturen
implementiert. In der Hilfe findet ihr diese unter <User Defined
Functions> <StructureConstants Management>.
Als Hauptinformationsquelle verwende ich die Windows
Api Referenz. Dort findet ihr neben allen API-Funktionen die
zugehörigen Messages, Notifikationen, Strukturen und Konstanten.
Zum Erstellen einer Struktur stehen in AutoIt folgende Datentypen zur Verfügung
|
Type |
Details |
|
byte |
8Bit
(1Byte) signed char |
|
ubyte |
8Bit
(1Byte) unsigned char |
|
char |
8Bit (1Byte)
ASCII char |
|
wchar |
16Bit
(2Byte) Wide char |
|
short |
16Bit
(2Bytes) signed integer |
|
ushort |
16Bit
(2Bytes) unsigned integer |
|
int |
32Bit
(4Bytes) signed integer |
|
uint |
32Bit
(4Bytes) unsigned integer |
|
long |
32Bit
(4Bytes) signed integer |
|
ulong |
32Bit
(4Bytes) unsigned integer |
|
dword |
32Bit
(4Bytes) unsigned integer |
|
ptr |
32Bit
(4Bytes) integer |
|
hwnd |
32Bit
(4Bytes) integer |
|
float |
32Bit
(4Bytes) floating point |
|
double |
64Bit
(8Bytes) floating point |
|
int64 |
64Bit
(8Bytes) signed integer |
|
uint64 |
64Bit
(8Bytes) unsigned integer |
|
int_ptr |
32
oder 64Bit signed integer (äbhängig ob x86 oder x64 Version von AutoIt
genutzt wird) |
|
uint_ptr |
32 oder 64Bit signed integer (äbhängig ob x86 oder x64 Version von AutoIt genutzt wird) |
|
long_ptr |
32 oder 64Bit unsigned integer (äbhängig ob x86 oder x64 Version von AutoIt genutzt wird) |
|
ulong_ptr |
32 oder 64Bit unsigned integer (äbhängig ob x86 oder x64 Version von AutoIt genutzt wird) |

In der allgemeinen Definition ist als optionaler
Parameter noch Pointer angegeben. Darauf gehe ich im Punkt Pointer
näher ein.



| Struct | ist die Variable, der mit "DllStructCreate" erstellten Struktur |
| Element | ist entweder der 1-basierte Index des Wertes in der Struktur oder der Bezeichner |
| value | ist der zu übergebende Wert |
| index | [optional] ist das Element ein Array, kann auf ein einzelnes Arrayelement mit diesem Index zugegriffen werden |




| Struct | ist die Variable, der mit "DllStructCreate" erstellten Struktur |
| Element | ist entweder der 1-basierte Index des Wertes in der Struktur oder der Bezeichner |
| index | [optional] ist das Element ein Array, kann auf ein einzelnes Arrayelement mit diesem Index zugegriffen werden |



| Struct | ist die Variable, der mit "DllStructCreate" erstellten Struktur |
| Element | [optional] der 1-basierte Indexwert des Elementes aus der Struktur, auf das der Pointer zeigen soll |


| DLL | die Dll, die wir nutzen möchten |
| Rückgabetyp | der Datentyp, den der Dll-Aufruf zurückliefert |
| Funktionsname | die Funktion aus der Dll, die wir aufrufen möchten |
| Parametertyp | [optional] Datentyp des Parameters |
| Parametername | [optional] Name des Parameters |
| ... | [optional] weitere
Parametertypen/ -namen |

| DLL | Meine.DLL |
| Funktion | IrgendWas |
| Returntyp | long |
| Parameter | ElementName |
| Parameter Typ | String Array |





"Funktionsname"
"DLL" ["Alias-Funktionsname"] ("Parametername",
"Parametertyp", ...) Rückgabetyp

| DLL | kernel32 |
| Rückgabetyp | long |
| Funktionsname | Beep (der Alias braucht nur verwendet werden, wenn er vom Funktionsnamen abweicht) |
| Parmetertyp | long |
| Parametername | dwFreq (500) |
| Parmetertyp | long |
| Parametername | dwDuration (700) |
Und so
sieht nun
der fertige Aufruf aus:

| hWnd | hier können wir 0 übergeben, da wir die Nachricht allgemein anzeigen |
| lpText | hier kommt unser Text rein: "Hallo Welt!" |
| lpCaption | das ist der Titel der MsgBox, wir nehmen: "Test" |
| uType | wir brauchen nur den OK-Button, das ist die 0 |





