COMATLATLMFCMFC mfciunknownmfcccmdtargetcommfccom mfccom
1.1.1
#pragma oncetypedef long hresult;//{30df3430-0266-11cf-baa6-00aa003e0eed}extern const GUID clsid_math;//{0x30df3430, 0x266, 0X11CF, {0xba, 0xa6, 0x0, 0xaa, 0x0, 0x3e, 0xe, 0xed}};///////////////////////////////////////////////////////// {30df3432-0266-11cf-baa6-00aa003e0eed}extern Const GUID iid_ioperator;//{ 0x30df3432, 0x266, 0X11CF, {0xba, 0xa6, 0x0, 0xaa, 0x0, 0x3e, 0xe, 0xed}};class ioperator:public Iunknown{public:virtua l HRESULT _stdcall ADD (int nParam1, int nParam2, int* pResult) =0;virtual HRESULT _stdcall Subtract (int nParam1, int Npara M2, int* pResult) =0;virtual HRESULT _stdcall Multiple (int nParam1, int nParam2, int* pResult) =0;virtual HRESULT _stdcall Divide (int nParam1, int nParam2, int* pResult) =0;};/ /{30df3433-0266-11cf-baa6-00aa003e0eed}extern const GUID iid_iadvanceoperator;//{0x30df3433, 0x266, 0X11CF, {0xba, 0xa6, 0x0, 0xaa, 0x0, 0x3e, 0xe, 0xed}};class iadvanceoperator:public iunknown{public:virtual HRESULT _stdcall ABS (int nParam1, int* pResult) =0;virtual HRESULT _stdcall Power (int nParam1, int nParam2, int* pResult) = 0;};
Cmymath command Targetclass cmymath:public ccmdtarget{declare_dyncreate (Cmymath) Public:cmymath (); Virtual ~CMyMath (); virtual void onfinalrelease ();p rotected:declare_olecreate (Cmymath) Declare_message_map () Declare_dispatch_map () Declare_interface_map () Begin_interface_part (OPerator, Ioperator) stdmethod_ (HRESULT, ADD) (int nParam1, int nParam2, int* PResult); Stdmethod_ (HRESULT, Subtract) (int nParam1, int nParam2, int* pResult); Stdmethod_ (HRESULT, multiple) (int nParam1, int nParam2, int* pResult); Stdmethod_ (HRESULT, Divide) (int nParam1, int nParam2, int* pResult); End_interface_part (OPerator) Begin_interface_part (Advanceoperator, Iadvanceoperator) stdmethod_ (HRESULT, Abs) (int nParam1, int* pResult); Stdmethod_ (HRESULT, Power) (int nParam1, int nParam2, int* pResult); End_interface_part (Advanceoperator)};
1.2
#include "stdafx.h" #include "MyCom16.h" #include "MyMath.h"//Cmymathimplement_dyncreate (Cmymath, CCmdTarget) Cmymath :: Cmymath () {enableautomation (); Enableaggregation ();} Cmymath::~cmymath () {}void cmymath::onfinalrelease () {//when the last reference for a Automation object is released//OnFi Nalrelease is called. The base class would automatically//deletes the object. Add additional cleanup required for your//object before calling the base class. Ccmdtarget::onfinalrelease ();} Begin_message_map (Cmymath, CCmdTarget) End_message_map () Begin_dispatch_map (Cmymath, CCmdTarget) END_DISPATCH_MAP () Note:we add support for Iid_imymath to support Typesafe binding//from VBA. This IID must match the GUID, which is attached to the//dispinterface in the. IDL file.//{7259ea0f-0e64-4ff9-bba1-332e82afa0d3}static const IID iid_imymath ={0x7259ea0f, 0xe64, 0x4FF9, {0xBB, 0xA1, 0x33, 0x2e, 0x82, 0xAF, 0xA0, 0xd3}};static const GUID iid_ioperator = {0x30df3432, 0x266, 0X11CF, {0xba, 0xa6, 0x0, 0xaa, 0x0, 0x3e, 0XE, 0xed}};static const GUID iid_iadvanceoperator = {0x30df3433, 0x266, 0X11CF, {0xba, 0xa6, 0x0, 0XAA, 0 X0, 0x3e, 0xe, 0xed}};//clsid_mathimplement_olecreate (Cmymath, "Mycom16.mymath", 0x30df3430, 0x266, 0X11CF, 0xba, 0xa6, 0x0, 0xaa, 0x0, 0x3e, 0xe, 0xed) begin_interface_map (Cmymath, CCmdTarget) Interface_part (Cmymath,iid_imymath, Dispatch) Interface_part (Cmymath,iid_ioperator,operator) Interface_part (cmymath,iid_iadvanceoperator,advanceoperator) END_ Interface_map ()//Cmymath message Handlersulong cmymath::xoperator::addref () {method_prologue (Cmymath, OPerator); return Pthis->externaladdref ();} ULONG cmymath::xoperator::release () {method_prologue (Cmymath, OPerator); return Pthis->externalrelease ();} HRESULT Cmymath::xoperator::queryinterface (REFIID riid, void** ppobject) {method_prologue_ex_ (Cmymath, OPerator); return Pthis->externalqueryinterface ((void *) &riid,ppobject);} HRESULT cmymath::xoperator::add (int nParam1, int nParam2, int* pResult) {*presult =NPARAM1 + Nparam2;return S_OK;} HRESULT cmymath::xoperator::subtract (int nParam1, int nParam2, int* pResult) {*presult = Nparam1-nparam2;return S_OK;} HRESULT cmymath::xoperator::multiple (int nParam1, int nParam2, int* pResult) {*presult = nParam1 * Nparam2;return S_OK;} HRESULT cmymath::xoperator::D ivide (int nParam1, int nParam2, int* pResult) {*presult = Nparam1/nparam2;return S_OK;} ULONG Cmymath::xadvanceoperator::addref () {method_prologue (Cmymath, advanceoperator); return Pthis->externaladdref ();} ULONG cmymath::xadvanceoperator::release () {method_prologue (Cmymath, advanceoperator); return Pthis->externalrelease ();} HRESULT Cmymath::xadvanceoperator::queryinterface (REFIID riid, void** ppobject) {method_prologue (CMyMath, Advanceoperator); return Pthis->externalqueryinterface ((void *) &riid,ppobject);} HRESULT _stdcall cmymath::xadvanceoperator::abs (int nParam1, int* pResult) {if (nParam1 < 0) *presult =-nparam1;else*p Result = Nparam1;return S_OK;} HRESULT _STDCAll Cmymath::xadvanceoperator::P ower (int nParam1, int nParam2, int* pResult) {*presult =1;for (int i=0;i<nparam2;i++) * PResult *=nparam1;return S_OK;}
2 2.1
#pragma oncetypedef long hresult;class iarea:public iunknown{public:virtual HRESULT _stdcall Triangle (int width, int high, float* pResult) =0;virtual HRESULT _stdcall Square (int lengh, float* pResult) =0;virtual HRESULT _stdcall Cirle ( int R, float* pResult) = 0;};
#pragma once#include "IArea.h"//CMyMath2 command Targetclass cmymath2:public ccmdtarget{declare_dyncreate (CMyMath2) Public:cmymath2 (); virtual ~cmymath2 (); virtual void onfinalrelease () ; Virtual BOOL oncreateaggregates (); Begin_interface_part (area, Iarea) stdmethod_ (HRESULT, Triangle) (int width, int. high, float* PResult); Stdmethod_ (HRESULT, Square) (int lengh, float* pResult); Stdmethod_ (HRESULT, Cirle) (int R, float* pResult); End_interface_part (area) protected:declare_olecreate (CMyMath2) Declare_message_map () Declare_dispatch_map () Declare_interface_map ()};
2.2
#include "MyMath2.h" #include <iostream>using namespace std;const float PI = 3.14;static Const GUID Clsid_math ={0x3 0df3430, 0x266, 0X11CF, {0xba, 0xa6, 0x0, 0xaa, 0x0, 0x3e, 0xe, 0xed}};//cmymath2implement_dyncreate (CMyMath2, Ccmdtar Get) Cmymath2::cmymath2 () {enableautomation ();} Cmymath2::~cmymath2 () {}void cmymath2::onfinalrelease () {//when the last reference for a Automation object is released//O Nfinalrelease is called. The base class would automatically//deletes the object. Add additional cleanup required for your//object before calling the base class. if (M_xinnerunknown!=null) {IUnknown *punk = (IUnknown *) m_xinnerunknown;punk->release ();} Ccmdtarget::onfinalrelease ();} Begin_message_map (CMyMath2, CCmdTarget) End_message_map () Begin_dispatch_map (CMyMath2, CCmdTarget) end_dispatch_map ()//Note:we add support for Iid_imymath2-to-typesafe binding//from VBA. This IID must match the GUID, which is attached to the//dispinterface in the. IDL file.//{60b1de57-1de8-4759-b220-c35e03b2049d}static Const IID iid_imymath2 ={0x60b1de57, 0x1de8, 0x4759, {0xb2, 0x20, 0xC3, 0x5E, 0x3, 0xb2, 0x4, 0x9d}};static const GUID Iid_iarea = {0x30df3452, 0x266, 0X11CF, {0xba, 0xa6, 0x0, 0xaa, 0x0, 0x3e, 0xe, 0xed}} ;//Clsid_mathimplement_olecreate (CMyMath2, "Mycom9.mymath2", 0x30df3450, 0x266, 0X11CF, 0xba, 0xa6, 0x0, 0xaa, 0x0, 0x3e , 0xe, 0xed) begin_interface_map (CMyMath2, CCmdTarget) Interface_part (CMyMath2, Iid_imymath2, Dispatch) interface_part (Cmymath2,iid_iarea,area) Interface_aggregate (Cmymath2,m_xinnerunknown)//cmymath2cmymathend_interface_map ()//CMyMath2CMyMathBOOL CMyMath2 :: Oncreateaggregates () {#if 0//::cocreateinstance (Clsid_math, (IUnknown *) This,clsctx_inproc_server,iid_iunknown, ( void *) &m_xinnerunknown); #elseLPUNKNOWN pUnk = GetControllingUnknown ();:: CoCreateInstance (Clsid_math, ( IUnknown *) Punk,clsctx_inproc_server,iid_iunknown, (void * *) &m_xinnerunknown); #endifreturn TRUE;} CMyMath2 message Handlershresult _stdcall cmymath2::xarea::tRiangle (int width, int high, float* pResult) {*presult =width*high *1.0/2;return S_OK;} HRESULT _stdcall cmymath2::xarea::square (int lengh, float* pResult) {*presult =lengh *lengh*1.0/2;return S_OK;} HRESULT _stdcall Cmymath2::xarea::cirle (int R, float* pResult) {*presult = PI *r*r;return S_OK;} ULONG Cmymath2::xarea::addref () {method_prologue (CMyMath2, area); return Pthis->externaladdref ();} ULONG cmymath2::xarea::release () {method_prologue (CMyMath2, area); return Pthis->externalrelease ();} HRESULT Cmymath2::xarea::queryinterface (REFIID riid, void** ppobject) {method_prologue_ex_ (CMyMath2, area); return Pthis->externalqueryinterface ((void *) &riid,ppobject);;}
3.
#include ". /mycom16/operator.h "#include". /mycom9/iarea.h "using namespace std;static const GUID Clsid_math ={0x30df3430, 0x266, 0X11CF, {0xba, 0xa6, 0x0, 0xaa, 0x 0, 0x3e, 0xe, 0xed}};static const GUID iid_ioperator ={0x30df3432, 0x266, 0X11CF, {0xba, 0xa6, 0x0, 0xaa, 0x0, 0x3e, 0 XE, 0xed}};static const GUID iid_iadvanceoperator ={0x30df3433, 0x266, 0X11CF, {0xba, 0xa6, 0x0, 0xaa, 0x0, 0x3e, 0xe, 0xed}};static Const GUID clsid_math2 = {0x30df3450, 0x266, 0X11CF, {0xba, 0xa6, 0x0, 0xaa, 0x0, 0x3e, 0xe, 0xed}};st atic Const GUID Iid_iarea = {0x30df3452, 0x266, 0X11CF, {0xba, 0xa6, 0x0, 0xaa, 0x0, 0x3e, 0xe, 0xed}};int _tmain (int a RGC, _tchar* argv[]) {CLSID clsid;iclassfactory *pmathfactory = null;iunknown* Punknown = null;iunknown* PUnk = NULL;IOPera Tor *poperator = null;iadvanceoperator *padvanceoperator = Null;iarea *parea = Null;iarea *parea2 = NULL;IAdvanceOPera Tor *padvanceoperator2 = Null;int nresult = 0; HRESULT hres; CoInitialize (NULL); ///////////////////////Test mycom1///////////////////////////////////////////////////////////////////#if 1//clsidfromprogid (_T (" Testcom1 Server "), &clsid); hres = CoGetClassObject (Clsid_math, Clsctx_server, NULL, Iid_iclassfactory, (void**) &pmathfactory); if (FAILED (hres)) {return 0;} Pmathfactory->createinstance (Null,iid_ioperator, (void * *) &poperator);p mathfactory->release (); Poperator->add (5,6,&nresult); cout<< "5+6 =" <<nresult<<endl;poperator->multiple (5,6,&nresult);cout<< "5*6 =" < <nresult<<endl;poperator->divide (5,6,&nresult);cout<< "5/6 =" <<nResult<<endl; Poperator->queryinterface (Iid_iadvanceoperator, (void * *) &padvanceoperator);p Advanceoperator->abs (-123 , &nresult); cout<< "Abs ( -123) =" <<nresult<<endl;padvanceoperator->power (5,3,&nresult);cout<< " Power (5,3) = "<<nResult<<endl; Padvanceoperator->queryinterface (IID_IUnknown, (void *) &punknown);p OperaTor->queryinterface (IID_IUnknown, (void * *) &punk); Punk->queryinterface (Iid_iadvanceoperator, (void * *) &padvanceoperator2); if (PUnk = = Punknown) cout<< "They is the same COM obj" <<endl;elsecout<< "they not equal obj" <<endl ;p unknown->release ();p unk->release ();p advanceoperator->release ();p operator->release (); Padvanceoperator2->release ();p operator = Null;padvanceoperator = Null;punk = Null;punknown = Null;padvanceoperator2 =null; #endif/* Com9 com1*/#if 1pOPerator = Null;padvanceoperator = Null;punk =null;punknown = Null;//clsidfromprogid (_T ( "Testcom1 Server"), &clsid); hres = CoGetClassObject (Clsid_math2, Clsctx_server, NULL, Iid_iclassfactory, (void**) & Amp;pmathfactory); if (FAILED (hres)) {return 0;} Pmathfactory->createinstance (Null,iid_iarea, (void * *) &parea);p mathfactory->release (); Float Fresult =0.0f;parea->triangle (3,4,&fresult);cout<< "Triangle (3,4) =" <<fresult<<endl ;p Area->cirle (5,& fresult);cout<< "Cirle (5) =" <<fResult<<endl; Parea->queryinterface (Iid_ioperator, (void *) &poperator);p Operator->add (5,6,&nresult);cout< < "5+6 =" <<nresult<<endl;poperator->multiple (5,6,&nresult);cout<< "5*6 =" << Nresult<<endl;poperator->divide (5,6,&nresult);cout<< "5/6 =" <<nResult<<endl; Poperator->queryinterface (Iid_iadvanceoperator, (void *) &padvanceoperator);p advanceoperator-> QueryInterface (Iid_iarea, (void * *) &parea2); if (Parea = = pArea2) cout<< "They is the same COM obj" <<endl; elsecout<< "They not Equal obj" <<endl;parea->queryinterface (IID_IUnknown, (void * *) &punknown); Poperator->queryinterface (IID_IUnknown, (void * *) &punk); if (PUnk ==punknown) cout<< "They is the same COM Obj "<<endl;elsecout<<" they not Equal obj "<<endl;punknown->release ();p unk->release (); Parea->release ();p operator->release ();p AdvanCeoperator->release ();p area2->release (); #endif:: CoUninitialize (); return 0;}
A COM aggregation sample implemented with MFC