COM Vererbung
-
Hallo,
ich weiß nicht genau, in welchem Bereich ich das hier posten sollte, WinAPI ist es ja nicht so ganz, vielleicht eher Visual C++, aber da es sich um ATL/COM mit C++ handelt, dachte ich, könnte ich auch hier richtig sein.
Ich habe eine Frage:
Ist es möglich von eigens definierten Interfaces (welche eventuell sogar von IDispatch z.B. erben) zu erben? Also so was wieinterface IMyBase: IDispatch{ //... }; interface IMyDerived: IMyBase{ //... };Weil irgendwie macht das ganze mir Probleme, da ich von MIDL.exe immer den Error erhalte, dass das LayOut von IMyDerived so nicht dargestellt werden kann.
Das ganze wär echt wichtig für mich, da IMyBase auch des öfteren geerbt werden müsste, ansonsten müsste ich in den Klassen, welche die entsprechenden Interfaces implementieren auch jeweils IMyBase implementieren und das Ganze könnte unter Umständen ein paar kleinere Probleme, v.a. in der Benutzung aufwerfen. Wäre echt cool, wenn einer hier Ahnung davon hätte und mir weiterhelfen könnte. Bin in COM auch selbst noch nicht so fit, bzw. benutze es (beruflich) fast ausschließlich als C++-Wrapper, da COM in meiner Firma vorgeschrieben ist.
-
Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum WinAPI verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Ein solche Vererbung geht definitiv. Aber ohne Code oder genauere
Fehlerbeschreibung von dir kann man dir wohl kaum weiterhelfen.
-
jo, naja, habs inzwischen hingebracht...
es hing daran, dass der Wizard von VS ids für die einzelnen Methoden erstellt hat.
Diese fingen bei 1 an...
Jetzt hatte ich im abgeleiteten Interface ebenfalls eine Methode mit der id 1. Das hatte zur Folge, dass MIDL.exe den Fehler "LayOut failed" geliefert hat. Irgendwann habe ich die IDs dann erhöht und gemerkt... Moment, jetzt gehts und dann habe ich versucht, sie komplett weg zu lassen und siehe da... das geht auch.
Naja, auf jeden Fall habe ich die IDs jetzt im abgeleiteten Interface komplett entfernt und alles ist Tutti. Leider findet man online dazu keinerlei Informationen irgendwie
-
so, naja, nachdem ich das hingebracht habe, ist bei mir das nächste Problem aufgelaufen.
Da ich nicht nur das Interface, sondern auch einen Teil der Klassenimplementierung vererben möchte, habe ich dies nun versucht und mir eine Klasse erstellt, von der einige Implementierungen erben sollen, da einiges öfters gleich ist. Deswegen habe ich mir überlegt, ich könnte ja eine Basisklasse erstellen, die bestimmte Methoden implementiert und diese an die abgeleiteten Klassen vererbt. Also hier ist mein prinzipieller Aufbau:class ATL_NO_VTABLE baseclass: IBaseInterface { //Methodendeklarationen + -implementierungen in der *.cpp file };so sieht zumindest meine Basisklasse aus, sinnvollerweise sind die Methoden auch noch mittels
STDMETHOD(call_me_a_method)(BSTR x, LONG y);also "COM-fähig" deklariert.
Nun erhalte ich allerdings Fehler beim Kompilieren der abgeleiteten Klassen, die von den (vom Wizard erzeugten) COM-Basisklassen erben.
Der Output ist annähernd folgender (kann jetzt nicht die Klassennamen etc posten, hat andere Gründe):1>... error C2594: 'argument' : ambiguous conversions from '<classname> *const ' to 'IDispatch *' 1>... error C2243: 'type cast' : conversion from '<classname> *const ' to 'IDispatch *' exists, but is inaccessibleWeiß da irgendwer bescheid, bzw kann mir da irgendwer helfen?
Wär echt verdammt cool, weil sonst muss ich nen total unschönen Aufbau meiner Klassen verwenden.
-
Sorry, dass ich hier noch mal schreiben muss, aber ich habe eine weitere Frage (nachdem die alte eigentlich obsolet ist):
Ist es nun möglich, COM-Implementierungen zu vererben, um nicht auf Aggregation oder Ähnliches angewiesen zu sein?
Wenn die Vererbung nicht geht, habe ich nämlich das Problem, dass entweder die Implementierung der Klasse ziemlich groß wird oder ich gleiche Methoden häufig implementieren muss. Geht das über einen Weg?
Ich habe es jetzt schon folgendermaßen probiert:class BaseImpl: public IBase { //methoden etc }; class DerivedImpl: public BaseImpl, public IDerived { //methoden etc }; class ATL_NO_VTABLE CDerived: public CComObjectRootEx<CComSingleThreadModel>, public CComCoClass<CDerived, &CLSID_Derived>, public ISupportErrorInfo, public IDispatchImpl<DerivedImpl, &IID_ISimple, &LIBID_paramlibcomLib, /*wMajor =*/ 1, /*wMinor =*/ 0> { //... was noch so kommt };und jetzt würde eigentlich die COM_MAP kommen, allerdings erhalte ich da immer Fehlermeldungen bezüglich ambiguous casts zu IDispatch * . Ich weiß jetzt nicht, ob irgendwer eine Ahnung davon hat, wäre auf jeden Fall ganz cool, wenn des gehen würde und mir irgendwer das sagen könnte.