Re: Interna einer Automations-App
From: Martin Richter [MVP] (martin.richter_at_mvps.org)
Date: 03/07/05
- Next message: Andre Stille [MVP]: "Re: Interna einer Automations-App"
- Previous message: Matthias Meier: "Baumstruktur in Datenstruktur"
- In reply to: Andreas Heyer: "Interna einer Automations-App"
- Next in thread: Andreas Heyer: "Re: Interna einer Automations-App"
- Reply: Andreas Heyer: "Re: Interna einer Automations-App"
- Messages sorted by: [ date ] [ thread ]
Date: Mon, 07 Mar 2005 09:35:27 +0100
Hallo Andreas!
> ich habe mir die Frage gestellt, wie Word und Co. intern funktionieren.
> Wenn man VBA oder VBS nimmt, dann kann man über die Automation auf viele
> hierarchisch angeordnete COM-Objekte zugreifen. Nun glaube ich nicht,
> dass diese Apps intern CoCreateInstance für ihre eigenen Objekte
> aufrufen (z.B. mit einer angepassten Factory), oder etwa doch? Gibt es
> eine Möglichkeit, aus z.B. einer C++-Klassen-Instanz nachträglich ein
> COM-Objekt werden zu lassen, damit man es bei der Automatisierung
> zurückgeben kann?
Wenn Du eine Funktion hast, die einen Zeiger auf ein anderes Objekt
returniert, dann genügt es dieses Objekt einfach in Deiner
Prozessumgebung mitnew anzulegen und den entsprechenden Schnittstellen
Zeiger zu returnieren.
Der RPC-Proxy/Stub der Deine Funktion aufgerufen hat und nun einen
Zeiger zurückbekommt, muss nun selber (wenn nötig) wieder entsprechend
einen neuen Proxy/Stub erzeugen.
Du returnierst nur einfach einen IUnknown Zeiger oder was auch immer,
wie es in der IDL steht.
Ich habe dafür einige Templates die das erledigen:
template<class TB, class TI>
HRESULT CreateAGComObject(TI **ppVal)
{
// Must be a valid pointer
if (!ppVal)
return E_POINTER;
*ppVal = NULL;
// Create this object
CComObject<TB> *pObj = 0;
HRESULT hr;
hr = CComObject<TB>::CreateInstance(&pObj);
if (SUCCEEDED(hr))
{
pObj->AddRef();
if (SUCCEEDED(hr))
hr = pObj->QueryInterface(__uuidof(TI),(void**)ppVal);
pObj->Release();
}
return hr;
}
Und so sieht dann die Nutzung aus, wenn z.B. ein Enumerator erzeugt
werden muss. m_data sind einfach die Daten, mit denen der enumerator
initialisiert werden muss:
STDMETHODIMP CAGComForms::get__NewEnum(IUnknown** ppVal)
{
AFX_MANAGE_STATE(AfxGetAppModuleState());
VALIDATE_POINTER(ppVal);
return CreateAGComObject<CAGComFormsEnumerator>(ppVal,m_data);
}
Nur als Hinweis: CComObject<Base>::CreateInstance ruft in keiner Weise
CoCreateInstance auf.
> Als zweites nun noch das: Kennt jemand den Pfad zur
> COM-Standard-Beschreibung? Ich wundere mich nämlich, wie das mit der
> vtable-Anordnung gemacht wird. Die Reihenfolge der Funktionen in IDL und
> in der C++-Klasse muss ja nicht übereinstimmen, und der C-Compiler weiß
> auch nichts von der IDL. Wie also machen dass z.B. Programmiersprachen,
> die C-Header nicht verarbeiten können und nur die Typelib zur Verfügung
> haben? Weichen die alle auf IDispatch aus? Es wäre mir allerdings nicht
> bekannt, dass z.B. Delphi nur duale Interfaces nutzen kann. Also wie
> geht das?
Wenn Du Dir die ATL Implementierung ansiehst, dann wird der
Interfacename direkt als Baisklasse angegeben. Damit ist die Reihenfolge
der Funktionen klar, oder?
Hier mal ein Beispiel aus einer meiner Applikationen. Es ist das Haupt
Objekt (Application), von dem alle anderen Objekte der Objekt Hierarchie
bezogen werden können:
class ATL_NO_VTABLE CAGComApplication :
public CObject,
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CAGComApplication, &AGCom::CLSID_AgvipApplication>,
public IDispatchImpl<AGCom::Application, &AGCom::IID_Application,
&AGCom::LIBID_AGVIPLib, /*wMajor =*/ 1, /*wMinor =*/ 0>
Wie Du siehst wird in IDispatchImpl, AGCom::Application als Interface
angegeben. Die Beschreibung des Interface (also die Header Datei) wurde
durch meine IDL Datei vorgegeben und durch den MIDL erzeugt.
Ich empfehle Dir als Literatur: "Essential COM" von Don Box und "ATL
internals" Rectors und Sells
HTH
-- Martin Richter [MVP] WWJD "In C we had to code our own bugs. In C++ we can inherit them." FAQ : http://www.mpdvc.de Samples: http://www.codeguru.com http://www.codeproject.com
- Next message: Andre Stille [MVP]: "Re: Interna einer Automations-App"
- Previous message: Matthias Meier: "Baumstruktur in Datenstruktur"
- In reply to: Andreas Heyer: "Interna einer Automations-App"
- Next in thread: Andreas Heyer: "Re: Interna einer Automations-App"
- Reply: Andreas Heyer: "Re: Interna einer Automations-App"
- Messages sorted by: [ date ] [ thread ]
Relevant Pages
|