Zitat von
Schrammel:
Der Weg ist relativ einfach, wenn die aufgerufene
API-Funktion die möglichkeit bietet, einen Benutzer-definierten 32Bit-Wert zu übergeben,der an die Callback-Fukntion weitergerecht wird. Dann kannst Du folgendes machen:
- Auslagern der Callback-Funktion aus der Klasse
- Aufruf der
API-Funktion mit der Adresse der zu verwendenden Klasse als Benutzer-definierter Parameter
- In der Callback-Funktion muss dann der übergebene 32-Wert auf einen Zeiger auf den Klassentyp gecastet werden und schon hast Du die die Adresse der Klasseninstanz, mit der Du arbeiten möchtest!
Achtung: Du must ggf. sicherstellen, dass die Callback-Funktion im gleichen Thread aufgerufen wird, in dem auch der Aufruf der
API-Funktion erfolgte, ansonsten kann's zu blöden Fehlern kommen. Aber das ist ein anderes Thema.
Gruß
Stefan Schramm
Die Methode sieht mir am einfachsten aus und ist auch möglich, ich kann nen Parameter mitsenden.
Also ruf ich dann die
API-Funktion mit Cardinal(@self) auf als 32Bit wert.
Diesen bekomme ich dann in der Funktion und muss mir die klasse an der Adresse holen, geht das so?:
Delphi-Quellcode:
procedure midiInCallback(aMidiInHandle: PHMIDIIN; aMsg: uint; aData, aMidiData, aTimeStamp: integer); stdcall;
var
klasse: ^TSysEx;
begin
klasse := Pointer(aData); //aData ist der Parameter mit der Adresse!
klasse^.variable := wert;
{...}
end;
//Aufruf:
midiInOpen(@fHandle, device, Cardinal(@midiInCallback), Cardinal(@self), CALLBACK_FUNCTION);