Moin,
wie Du schon richtig erkannt hast, hat die DLL eine
Init Funktion, die laut Beschreibung zwingend als erste aufgerufen werden muss. Weil ein Aufruf von
DllCall eine nicht bereits geladenen DLL lädt und sofort wieder entlädt, mag der Aufruf der Init-Funktion 'verpuffen'. Zuerst einmal empfehle ich deshalb, die DLL vor der Nutzung dauerhaft zu laden:
Code: Select all
DllCall("LoadLibrary", "Str", "ASTAS_DLL.dll")
(Das Entladen erledigt das System bei Programmende automatisch!)
Dann musst Du Dir in der Doku die Beschreibung der Funktionsaufrufe, der Parameter und der Rückgabewerte ansehen.
Wegen
vermute ich, dass die Funktionen nach C-Standard aufgerufen werden. Für diese Aufrufe verwendet AHK im Parameter
Return Type der
DllCall() Funktion den Wert
CDecl.
Diese Funktion hat keinen Parameter, der Typ des Rückgabewerts ist
int. Der Aufruf ist deshalb:
Code: Select all
RC := DllCall("ASTAS_DLL.dll\AstasDllInit", "CDecl Int")
Diese Funktion ist wie
AstasDllInit, der Aufruf ist deshalb:
Code: Select all
Version:= DllCall("ASTAS_DLL.dll\AstasDllDLLVersion", "CDecl Int")
Code: Select all
int AstasDllReadData(int list_idx, t_DeviceData *p_dev_data)
Diese Funktion erwartet zwei Parameter. Der Erste vom Typ
int ist der Index des Geräts. Das muss ein Wert von 0 bis 15 sein.
Der Zweite ist ein Zeiger auf eine Datenstruktur, in die die Gerätewerte geschrieben werden sollen:
Code: Select all
typedef struct
{
float brutto; // Brutto / Messwert
float netto; // Netto
float tara; // Tara
float min; // Min (bezogen auf aktuelle An-Zeit)
float max; // Max (bezogen auf aktuelle An-Zeit)
int me; // Maßeinheit
int dec; // Anzahl Nachkommastellen
int status; // Status-Byte
} t_DeviceData;
Diese Struktur enthält 8 32-Bit Werte, 5 mal
float und 3 mal
int. In AHK wird der notwendige Speicherlatz mir
VarSetCapacity() reserviert:
Code: Select all
VarSetCapacity(DeviceDate, 8 * 4, 0)
Die Adresse des Bereichs wird der Funktion übergeben:
Code: Select all
Idx := 0
VarSetCapacity(DeviceData, 8 * 4, 0)
RC := DllCall("ASTAS_DLL.dll\AstasDllReadData", "Int", Idx, "Ptr", &DeviceData, "CDecl Int")
Wenn der Aufruf klappt, stehen die Gerätedaten in der Variablen
DeviceData. Du kannst sie dann mit
NumGet() auslesen.
Viel Spaß noch!