Einzelnen Beitrag anzeigen

Eichhoernchen

Registriert seit: 22. Apr 2004
Ort: Hagen
322 Beiträge
 
Turbo Delphi für Win32
 
#9

Re: Callbackfunktion in Klasse

  Alt 16. Okt 2006, 13:53
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);
Jan
  Mit Zitat antworten Zitat