资源描述:
《Com对象的实现(续》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、COM对象的实现(续)潘爱民2003-10-10http://www.icst.pku.edu.cn/CompCourse2003/复习COM对象IDL描述对象的创建:类厂位置透明注册表自注册的COM组件回顾:客户创建对象过程客户提供信息组件位置、clsid、iid、结果接口指针地址ppv过程:根据组件位置,LoadLibraryGetProcAddress,获取DllGetClassObject用clsid和IID_IClassFactory获得类厂对象接口指针pFactory用iid、ppv调用pFactory->Creat
2、eInstance位置透明性的实现利用注册表在COM组件和客户之间引入中介COM库创建过程COM库处于COM组件和客户中间调用过程对于进程内组件,COM库不再参与处理COM对象创建过程客户组件COM创建函数COM库DllGetClassObject类厂对象接口指针COM创建函数COM库中三个用于创建组件的函数:CoGetClassObjectCoCreateInstanceCoCreateInstanceExCoGetClassObject创建一个类厂HRESULTCoGetClassObject(constCLSID&clsi
3、d,DWORDdwClsContext,COSERVERINFO*pServerInfo,constIID&iid,(void**)ppv);CoCreateInstanceHRESULTCoCreateInstance(constCLSID&clsid,IUnknown*pUnknownOuter,DWORDdwClsContext,constIID&iid,(void**)ppv);CoCreateInstance实现伪码HRESULTCoCreateInstance(constCLSID&clsid,IUnknown*pU
4、nknownOuter,DWORDdwClsContext,constIID&iid,void*ppv){IClassFactory*pCF;HRESULThr;hr=CoGetClassObject(clsid,dwClsContext,NULL,IID_IClassFactory,(void*)pCF);if(FAILED(hr))returnhr;hr=pCF->CreateInstance(pUnkOuter,iid,(void*)ppv);pCF->Release();returnhr;}CoCreateInstanc
5、eExHRESULTCoCreateInstanceEx(constCLSID&clsid,IUnknown*pUnknownOuter,DWORDdwClsContext,COSERVERINFO*pServerInfo,DWORDdwCount,MULTI_QI*rgMultiQI);三个创建函数选用原则如果客户创建远程对象或者希望一次获取对象的多个接口指针,则选用CoCreateInstanceEx函数;如果客户希望获取类厂对象或者要调用类厂的某些成员函数,则选用CoGetClassObject函数;在其他情况下,使用Co
6、CreateInstance函数创建对象,这是最常用的方法。创建过程示意图类厂的实现classCDictionaryFactory:publicIClassFactory{protected:ULONGm_Ref;public:CDictionaryFactory(void);~CDictionaryFactory(void);//IUnknownmembersHRESULTQueryInterface(constIID&iid,void**ppv);ULONGAddRef();ULONGRelease();//IClassFa
7、ctorymembersHRESULTCreateInstance(IUnknown*,constIID&iid,void**ppv);HRESULTLockServer(BOOL);};CreateInstance函数的实现HRESULTCDictionaryFactory::CreateInstance(IUnknown*pUnknownOuter,constIID&iid,void**ppv){CDictionary*pObj;HRESULThr;*ppv=NULL;hr=E_OUTOFMEMORY;if(pUnknown
8、Outer!=NULL)returnCLASS_E_NOAGGREGATION;pObj=newCDictionary();if(pObj==NULL)returnhr;//待续CreateInstance函数的实现(续)//续上页//Obtainthefirs