COM Programmierung
-
Hi, ich würde mich gerne mit der COM Programmierung vertraut machen.
Habt Ihr Empfehlungen zu Büchern oder Tutorials, die mir die Grundlagen
vermitteln?Konkret habe ich jetzt eine exe-Datei auf dem Tisch, die mit /regserver
registriert wurde. Ich habe wie folgt versucht weiter zu kommen:#import "C:\\fastcom.exe" no_namespace, raw_interfaces_only
Es wird dadurch offenbar eine idl und eine tlh Datei gebildet.
In der tlh finde ich diverse Funktionen der fastcom.exe.[tlh]
#pragma once #pragma pack(push, 8) #include <comdef.h> // // Forward references and typedefs // struct __declspec(uuid("78416eea-2c70-4b63-b36d-e6f5be207fc9")) /* LIBID */ __FastViewer; struct /* coclass */ Application; struct __declspec(uuid("c66c6d88-10a4-421d-adbb-83089f5a526f")) /* dual interface */ IApp; struct __declspec(uuid("be5d03c2-39a8-4412-ba7a-e6c5542e3603")) /* dispinterface */ _IFvwSessionEvents; struct /* coclass */ Session; struct __declspec(uuid("183c49c8-12eb-4788-bf5c-429e4f5b2410")) /* dual interface */ IFvwSession; struct /* coclass */ Client; struct __declspec(uuid("731ac984-12c5-4585-8d35-7ad29e68cbea")) /* dual interface */ IClient; // // Smart pointer typedef declarations // _COM_SMARTPTR_TYPEDEF(IApp, __uuidof(IApp)); _COM_SMARTPTR_TYPEDEF(_IFvwSessionEvents, __uuidof(_IFvwSessionEvents)); _COM_SMARTPTR_TYPEDEF(IFvwSession, __uuidof(IFvwSession)); _COM_SMARTPTR_TYPEDEF(IClient, __uuidof(IClient)); // // Type library items // struct __declspec(uuid("20178a27-ce38-4c1a-88ef-3f792ae802d8")) Application; // [ default ] interface IApp struct __declspec(uuid("c66c6d88-10a4-421d-adbb-83089f5a526f")) IApp : IDispatch { // // Raw methods provided by interface // virtual HRESULT __stdcall CreateSession ( /*[out,retval]*/ IDispatch * * retValue ) = 0; virtual HRESULT __stdcall GetSession ( /*[in]*/ long SessionId, /*[out,retval]*/ IDispatch * * retValue ) = 0; virtual HRESULT __stdcall get_Sessions ( /*[out,retval]*/ VARIANT * pVal ) = 0; virtual HRESULT __stdcall ShutDown ( /*[out,retval]*/ VARIANT_BOOL * retValue ) = 0; }; struct __declspec(uuid("be5d03c2-39a8-4412-ba7a-e6c5542e3603")) _IFvwSessionEvents : IDispatch {}; struct __declspec(uuid("ed226a1b-7119-4244-bfc6-d5192178d539")) Session; // [ default ] interface IFvwSession // [ default, source ] dispinterface _IFvwSessionEvents struct __declspec(uuid("183c49c8-12eb-4788-bf5c-429e4f5b2410")) IFvwSession : IDispatch { // // Raw methods provided by interface // virtual HRESULT __stdcall OpenSession ( /*[in]*/ BSTR Serial, /*[in]*/ BSTR Password, /*[in]*/ BSTR Clientname, /*[in]*/ long SessionId ) = 0; virtual HRESULT __stdcall JoinSession ( /*[in]*/ long SessionId, /*[in]*/ BSTR Password, /*[in]*/ BSTR Clientname ) = 0; virtual HRESULT __stdcall CloseSession ( /*[out,retval]*/ VARIANT_BOOL * retValue ) = 0; virtual HRESULT __stdcall get_SessionId ( /*[out,retval]*/ long * pVal ) = 0; virtual HRESULT __stdcall get_ClientId ( /*[out,retval]*/ long * pVal ) = 0; virtual HRESULT __stdcall get_State ( /*[out,retval]*/ long * pVal ) = 0; virtual HRESULT __stdcall get_Clients ( /*[out,retval]*/ VARIANT * pVal ) = 0; virtual HRESULT __stdcall GetClient ( /*[in]*/ long ClientId, /*[out,retval]*/ IDispatch * * retValue ) = 0; virtual HRESULT __stdcall GetProperty ( /*[in]*/ BSTR Name, /*[out,retval]*/ BSTR * retValue ) = 0; virtual HRESULT __stdcall SetProperty ( /*[in]*/ BSTR Name, /*[in]*/ BSTR Value ) = 0; }; struct __declspec(uuid("0558f697-83b3-4186-8600-d630a233ec1f")) Client; // [ default ] interface IClient struct __declspec(uuid("731ac984-12c5-4585-8d35-7ad29e68cbea")) IClient : IDispatch { // // Raw methods provided by interface // virtual HRESULT __stdcall GetProperty ( /*[in]*/ BSTR Name, /*[out,retval]*/ BSTR * retValue ) = 0; virtual HRESULT __stdcall SetProperty ( /*[in]*/ BSTR Name, /*[in]*/ BSTR Value ) = 0; virtual HRESULT __stdcall Disconnect ( /*[out,retval]*/ VARIANT_BOOL * retValue ) = 0; virtual HRESULT __stdcall SetMaster ( /*[out,retval]*/ VARIANT_BOOL * retValue ) = 0; virtual HRESULT __stdcall get_ID ( /*[out,retval]*/ long * pVal ) = 0; virtual HRESULT __stdcall get_Dead ( /*[out,retval]*/ VARIANT_BOOL * retValue ) = 0; }; #pragma pack(pop)Nun möchte ich CreateSession aufrufen und habe mir gedacht ich schnappe
mir IAppPtr und lege direkt los:IAppPtr pt; CString c,d; c="profile"; d="Support"; BSTR a = c.AllocSysString(); BSTR b = d.AllocSysString(); IDispatch** q=0;//?? HRESULT test=NULL; test = pt->CreateSession(q);//??Bei CreateSession steigt er mir dann aus in der comip.h:
// Allows this class to be used as the interface itself. // Also provides simple error checking. // Interface* operator->() const { if (m_pInterface == NULL) { _com_issue_error(E_POINTER); } return m_pInterface; //<--------------Exitus }Dies hängt mit test = pt->CreateSession(q); zusammen.
Was ich hier mache ich ganz große Stückelei ohne genau zu wissen, wie
man es richtig macht. Ich bitte euch mir etwas zu helfen, damit ich es
verstehen kann, wie soetwas richtig angegangen wird.Ich bin kein Programmierer, möchte aber dennoch gerne hinter diese
"Geheimnisse" kommen
-
-
Danke für die Buchempfehlungen!
Hast du einen Tipp was ich im obigen "Versuch" alles schon vergeigt habe
und anpassen müsste, um mal erste Erfolge verbuchen zu können?
-
Für die COM-Programmierung ist glaube ich die ATL sehr zu empfehlen, da sie doch einiges erheblich einfach für dich als Programmierer macht. Es gibt auch Tutorials dazu, genauso wie bei Codeproject.
Außer du bist Masochist, dann benutze die ATL nicht!

-
ChristianMu schrieb:
Hast du einen Tipp was ich im obigen "Versuch" alles schon vergeigt habe
und anpassen müsste, um mal erste Erfolge verbuchen zu können?Du benötigst erst eine Instanz von IApp um auf dieser Instanz dann z.B. CreateSession aufrufen zu können.
Beim Aufruf von CreateSession soll es so sein:
IAppPtr app; // Erzeuge hier ein Objekt für den IAppPtr, ev. mit CoCreateInstance oder // vielleicht bietet der Smart Pointer eine Create Funktion (a la IAppPtr::Create(...)) IDispatch* session = 0; HRESULT hr = app->CreateSession(&session); // Danach prüfe hr und sessionEdit:
Der IDispatch Zeiger ist vermutlich besser in einem Smart Pointer aufgehoben oder ev. sogar ein typisierten Smart Pointer.