Callback in VCL Anwendung



  • Hallo Allerseits,

    mir macht die Übergabe von Callback Funktionen zu schaffen. Und als Maschinenbauer, der im Studium nur mal JAVA programmiert hat ist das schwer genug ;-). Aber erstmal einige kurze Angaben zu meinem Projekt:

    Ich schreibe zur Zeit ein VCL-Programm mit Turbo C++ zur Ansteuerung einer Olympus Digitalkamera. Zu diesem Zweck binde ich eine DLL des Herstellers (MochaDLL.dll) ein. So weit so gut. Um Rückmeldungen/Events von der Digicam zu erhalten bietet die DLL zwei Möglichkeiten: Callback-Funktionen oder Windows Messages. Ich habe mich für Ersteres entschieden.

    So sieht der wohl wichtige Teil meines Codes aus:

    #include <vcl.h>
    #include "MochaDLL.h"
    #include "stdio.h"
    #include "Camera.h"
    #pragma link "MochaDLL.lib"
    #pragma hdrstop
    
    MOCHA_CALLBACKS	mCallbacks; // Struktur aus MochaDLL.h
    
    __fastcall TForm1::TForm1(TComponent* Owner)
    	: TForm(Owner)
    {
    	mCallbacks.pfnImageReady = ImageReady;
    	LONG lRet = InitMocha(&mCallbacks);
    }
    
    LONG32 CALLBACK ImageReady(ULONG32 lCam, ULONG32 ulObjHandle, void* pParam)
    {
    	return 0;
    }
    

    Die MOCHA_CALLBACKS Struktur sieht wie folgt aus:

    typedef struct __MOCHA_CALLBACKS {
    	MOCHAADDDEVFUNC	pfnAddDevice;
    	void*	pAddDeviceParam;
    	MOCHAREMOVEDEVFUNC	pfnRemoveDevice;
    	void*	pRemoveDeviceParam;
    	MOCHAIMAGEREADYFUNC	pfnImageReady;
    	void*	pImageReadyParam;
    	MOCHAPROPCHANGEDFUNC	pfnPropChanged;
    	void*	pPropChangedParam;
    	MOCHAUPDATECAPABILITIESFUNC pfnUpdateCapabilities;
    	void* pUpdateCapabilitiesParam;
    }	MOCHA_CALLBACKS, *PMOCHA_CALLBACKS;
    

    Der Compiler spuckt folgenden Fehler aus:

    [C++ Fehler] Camera.cpp(28): E2235 Elementfunktion muß aufgerufen oder ihre Adresse übernommen werden

    Was mache ich falsch?

    Vielen Dank schon mal für Eure Hilfe!



  • Bei welcher Zeile kommt denn dieser Fehler? Dein beispielcode hat keine 28 Zeilen.



  • Vielleicht:

    mCallbacks.pfnImageReady = &ImageReady;

    ???



  • Im Konstruktor von TForm1 ist die Funktion ImageReady doch noch gar nicht bekannt. Deklariere sie vorher.


Log in to reply