COM: IDispatch
-
Hallo,
ich arbeite mich gerade in COM ein. Ich hätte jetzt gerne eine möglichst simple Implementierung von IDispatch, um zu verstehen, wie das realisiert werden kann. Ich habe schon gegoogelt, aber alles was man da findet, sind die wildesten Template-Konstrukte. Kennt jemand eine Seite, auf der man so etwas findet oder hat jemand ein Stück Bsp.-Code?
Danke schon einmal!Gruß
void*
-
Naja, das du keine Beispiele findest, hängt vielleicht damit zusammen, das niemand mehr COM mit der alten API programmiert. Heute macht man das mit ATL oder MFC, und bastelt sich ActiveX-Komponenten zusammen. Geht auch viel einfacher und wird auch vom VC++ 2003 (und neuer) viel besser unterstützt.
-
Ne IDispatch implementation findest du in der atlcom.h unter dem namen IDispatchImpl, ist aber eigentlich nur wrapper um CComTypeInfoHolder.
CComTypeInfoHolder findest du im selben file, etwas weiter unten.
Die Schlüsselmethode hiet ist CComTypeInfoHolder::GetTI (denke mal ist es was die genau interesiert).
Hier wird die type-library geladen, von dort die informationen über dein interface raus gezogen und das ganze in ein ITypeInfo gestopft. Spätestens jetzt wird klar warum die keine 'von Hand' implementation finden kannst
Mit IDispatch bekommst du information zu deinem interface (mit hilfen von ITypeInfo ), z.b. welche methoden sind da, welche parameter habe sie, welche namen haben sie, ...
Mit reinen c++ mitteln kommst du aber an solche informationen nicht ran, sollest du nicht vorhaben zu jeder methoden definition gleich noch nen ganze satz an zusätlichen information für IDispatch zu tippen.
In COM regelt das MIDL compiler für dich. Dem gibts du ein IDL file, in welchen beschreiben ist wie dein intface heißt, welche GUID es hat, welche methoden, welche paremter, ob die [in], [out], [retval], .. sind ect.
Der MIDL baut dir daraus ein typelibrary (also nichts anderes als ein compiliertes IDL file) und die ATL kann sich die infos für ITypeInfo dann wiederum dort raus ziehen.