interface in VC++

In C++ gibt es leider keine "richtigen" Interfaces, aber eine abstrakte Basisklasse kommt dem am nächsten:

Code:
class IMeinInterface
{
  public:

    virtual int HoleMirDenWert() = 0;
};

In der DLL kannst du eine Klasse erzeugen, die von dieser Basisklasse abgeleitet ist.
Diese Klasse muss dann sämtliche Methoden aus dem Interface implementieren. Zusätzlich brauchst du eine simple Funktion, die dir von der DLL einen Pointer auf eine Basisklasse zurückgibt:

Code:
// in der DLL
CMeineTolleVomInterfaceAbgeleiteteKlasse    meineKlasse;

IMeinInterface* HoleInterface()
{
  return &meineKlasse;
}

Die DLL exportiert dann lediglich eine Funktion vom Typ IMeinInterface* HoleInterface().
Die Funktion holst du dir, rufst sie auf, und schon hast du eine Klasse, die alles zur Verfügung stellt, was das Interface vorgibt. Von den Innereien der Klasse siehst du nichts.
 
Was macht denn eigentlich der lustige Konstrukt:
Code:
interface MyInterface
{
  void MyInterfaceFunction(void);
};

Wozu sind denn eigentlich die *.idl - Files da?
 
.idl-Dateien sind Beschreibungen für COM-Objekte. Die sehen zwar sehr C-ähnlich aus, sind es aber nicht. Mit einer .idl-Datei kann ein Compiler die Einträge in die Registry für ein COM-Objekt anlegen, er weiss, welche Methoden vorhanden sind und welche Parameter die benötigen.

Wenn du genauer nachprüfst, wirst du sehen, dass interface (in C/C++) nur ein typedef für struct ist (oder wars gar nur ein define?).

Das deklariert in deinem Fall einfach ein Struct/Klasse mit der Funktion MyInterfaceFunction. Üblicherweise müssen die virtuell sein, damit du auch wirklich mit dem Interface arbeiten kannst. Das ist eines der wenigen Dinge, die Java besser hingekriegt hat. Bei C# gibt's Interfaces auch fest eingebaut.
 
Wenn nun meine State-Maschine feststellt das irgend ein Ereignis eintritt, soll sie eine Funktion aufrufen die eine Ebene höher definiert ist.
Was meinst Du mit 'eine Ebene höher'? Meinst Du in der Applikation, die die DLL einbindet?
Wenn ich das richtig verstanden habe, würde ich das über eine Callback-Funktion machen. Deren Adresse übergibst Du der DLL, die sie dann aufrufen kann.
 
richtig :-)
ich bin nun grade dabei eine callback-Funktion zu erstellen.
Nun soll es aber mal keine globade Funktion sein, sondern eine Methode einer Klasse.
Wie übergebe ich sie?

dll.h:
Code:
class CLASS_API CClass {
public:
	int testfunc1 (void test( void ) );
	CClass(void);
	// TODO: add your methods here.
};

Code:
class CDialogDlg : public CDialog
{
// Construction
public:
	void msgBeep();
	CDialogDlg(CWnd* pParent = NULL);	// standard constructor
.
.
.
};

nun möchte ich einen Pointer auf die Methode msgBeep übergeben.

das lief nicht:
Code:
	CClass test;
	test.testfunc1( msgBeep );
wie geht es richtig?
 
Du hast da eine Member-Funktion übergeben, das ist etwas anderes als eine globale Funktion. Bei Member-Funktion gibt es einen impliziten this-Pointer als zusätzlichen Parameter.
Erschwerend kommt hinzu, dass C++ Pointer auf Member-Funktion dummerweise immer an einen Klassentyp bindet. Es gibt da ein paar Möglichkeiten, drumrum zuarbeiten (fastdelegate ist da furchtbar praktisch).

In deinem Fall müsste CClass so aussehen:

Code:
class CLASS_API CClass 
{
  public:
    int (CDialogDlg::*testfunc1)( void );

    CClass(void);
    
}

Wie du siehst, hast du dabei das Problem, dass die Klasse der Funktion mit angegeben werden muss. Du könntest da auch keine andere Klasse nehmen.

Einfachste Methode: Wenn die Funktion schon ein Member sein muss, dann mach sie statisch.

Oder arbeite wirklich mit Interfaces, für sowas sind sie fast ideal.
 
Zurück