我总结了一下COM程序实现的过程, 希望有人能受益,有人能提提意见.
Com Implement Process
1. 组件程序要实现并导出函数DllRegisterServer()来注册组件到注册表中,该例程把CLSID_Ditionary注册到注册表中
2. 客户程序调用CoInitialize(NULL)来初始化COM库
3. 客户程序调用CoCreateInstance(CLSID_Dictionary, NULL, CLSCTX_INPROC_SERVER, IID_IUnknown, (void **)&pUnknown);
1)定义一个IClassFactory接口的指针,IClassFactory *pCF;
2)调用CoGetClassObject(CLSID_Dictionary, CLSCTX_INPROC_SERVER, NULL, IID_IClassFactory, (void *)pCF)
A. 从注册表中找到由CLSID_Dictionary所指定的COM对象(dll),并装入dll程序
B. 调用DllGetClassObject(CLSID_Dictionary, IID_IClassFactory, pCF) 创建类厂
a. 定义一个类厂的对象指针:CDictionaryFactory *pFactory = new CDictionaryFactory;
b. 用类厂的对象指针调用QueryInterface取得类厂对象的IID_IClassFactory接口指针: pFactory->QueryInterface (IID_IClassFactory, pCF);
c. 把得到的类厂接口指针pCF返回给DllGetClassObject(..., pCF);
C. DllGetClassObject(..., pCF)函数把类厂接口指针pCF返回给CoGetClassObject(..., pCF)
3)CoGetClassObject(..., pCF)把类厂接口指针pCF返回给CoCreateInstance(..., pUnknown)的pCF;
4)用类厂接口指针pCF调用类厂CDictionaryFactory的函数CreateInstance()来创建COM对象:
pCF->CreateInstance(NULL, IID_IUnknown, (void **)&pUnknown);
//注1:pFactory->QueryInterface (IID_IClassFactory, pCF); 这样得到的pCF可用来创建COM对象
//注2:pFactory->QueryInterface (IID_IClassFactory2, pCF); 这样得到的pCF可用来在创建COM对象时验证用户的许可证情况(更高级些)但需要类厂类CDictionaryFactory由IClassFactory2接口派生
//注3:由于CDictionaryFactory是由IClassFactory接口派生,IClassFactory接口的GUID为IID_IClassFactory, 所以pFactory->QueryInterface (IID_IClassFactory, pCF)返回的pCF指向IClassFactory接口,即可以调用IClassFactory接口的函数,但这些函数的实现在派生类CDictionaryFactory中。比如pCF可以调用从IClassFactory类中派生出来的CreateInstance()函数。总之就是一个接口的指针只能调用自己接口所具有的函数。
4)//接上页的4)
A. 定义一个客户真正需要的COM对象的指针 CDictionary *pObj = new CDictionary();
B. 调用CDictionary的QueryInterface()(//IUnknown member function): pObj->QueryInterface (IID_IUnknown, (void **)&pUnknown);
//注:IUnknown *pUnknown说明pUnknown是IUnknown类型的指针,但CDictionary 的QueryInterface()返回的pUnknown是IDictionary *类型的或ISpellCheck *类型的,但当pUnknown从pObj->QueryInterface()返回给pUnknow时会直接转换成IUnknown *类型的。
C. 类厂指针的操作 pCF->Release() //待续
D.把在B中创建的真正要用的COM对象的接口的指针(IUnknown *类型的指针)返回给CoCreateInstance(…)的pUnknown .
4.客户用pUnknown指针直接调用COM对象中的函数
1) IUnknown *pUnknown;
IDictionary *pDictionary;
ISpellCheck *pSpellCheck;
2) pUnknown->QueryInterface(IID_Dictionary, (void **)&pDictionary);
pDictionary->QueryInterface(IID_SpellCheck, (void **)&pSpellCheck);
3) pDictionary->LoadLibrary(L”animal.dict”) //IDictionary的函数
pSpellCheck->CheckWord(L”lion”, &stringResult); //ISpellCheck的函数
//注:pUnknown是IUnknown *类型的,IUnknown是IDictionary,ISpellCheck这两个接口的基类接口,所以可以用pUnknown调用QueryInterface()来获得IDictionary,ISpellCheck的接口指针,从而可以调用在CDictionary中的相应的函数。注意,IDictionary的接口指针只能调用CDictionary从IDictionary接口继承的函数,不能调用ISpellCheck的函数。同理ISpellCheck .
5.客户调用CoUninitialize(),在程序退出前,终止COM库服务函数。
如果有想和我一起学习和联系的: mkqu@comgi.com
32532824
Com Implement Process
1. 组件程序要实现并导出函数DllRegisterServer()来注册组件到注册表中,该例程把CLSID_Ditionary注册到注册表中
2. 客户程序调用CoInitialize(NULL)来初始化COM库
3. 客户程序调用CoCreateInstance(CLSID_Dictionary, NULL, CLSCTX_INPROC_SERVER, IID_IUnknown, (void **)&pUnknown);
1)定义一个IClassFactory接口的指针,IClassFactory *pCF;
2)调用CoGetClassObject(CLSID_Dictionary, CLSCTX_INPROC_SERVER, NULL, IID_IClassFactory, (void *)pCF)
A. 从注册表中找到由CLSID_Dictionary所指定的COM对象(dll),并装入dll程序
B. 调用DllGetClassObject(CLSID_Dictionary, IID_IClassFactory, pCF) 创建类厂
a. 定义一个类厂的对象指针:CDictionaryFactory *pFactory = new CDictionaryFactory;
b. 用类厂的对象指针调用QueryInterface取得类厂对象的IID_IClassFactory接口指针: pFactory->QueryInterface (IID_IClassFactory, pCF);
c. 把得到的类厂接口指针pCF返回给DllGetClassObject(..., pCF);
C. DllGetClassObject(..., pCF)函数把类厂接口指针pCF返回给CoGetClassObject(..., pCF)
3)CoGetClassObject(..., pCF)把类厂接口指针pCF返回给CoCreateInstance(..., pUnknown)的pCF;
4)用类厂接口指针pCF调用类厂CDictionaryFactory的函数CreateInstance()来创建COM对象:
pCF->CreateInstance(NULL, IID_IUnknown, (void **)&pUnknown);
//注1:pFactory->QueryInterface (IID_IClassFactory, pCF); 这样得到的pCF可用来创建COM对象
//注2:pFactory->QueryInterface (IID_IClassFactory2, pCF); 这样得到的pCF可用来在创建COM对象时验证用户的许可证情况(更高级些)但需要类厂类CDictionaryFactory由IClassFactory2接口派生
//注3:由于CDictionaryFactory是由IClassFactory接口派生,IClassFactory接口的GUID为IID_IClassFactory, 所以pFactory->QueryInterface (IID_IClassFactory, pCF)返回的pCF指向IClassFactory接口,即可以调用IClassFactory接口的函数,但这些函数的实现在派生类CDictionaryFactory中。比如pCF可以调用从IClassFactory类中派生出来的CreateInstance()函数。总之就是一个接口的指针只能调用自己接口所具有的函数。
4)//接上页的4)
A. 定义一个客户真正需要的COM对象的指针 CDictionary *pObj = new CDictionary();
B. 调用CDictionary的QueryInterface()(//IUnknown member function): pObj->QueryInterface (IID_IUnknown, (void **)&pUnknown);
//注:IUnknown *pUnknown说明pUnknown是IUnknown类型的指针,但CDictionary 的QueryInterface()返回的pUnknown是IDictionary *类型的或ISpellCheck *类型的,但当pUnknown从pObj->QueryInterface()返回给pUnknow时会直接转换成IUnknown *类型的。
C. 类厂指针的操作 pCF->Release() //待续
D.把在B中创建的真正要用的COM对象的接口的指针(IUnknown *类型的指针)返回给CoCreateInstance(…)的pUnknown .
4.客户用pUnknown指针直接调用COM对象中的函数
1) IUnknown *pUnknown;
IDictionary *pDictionary;
ISpellCheck *pSpellCheck;
2) pUnknown->QueryInterface(IID_Dictionary, (void **)&pDictionary);
pDictionary->QueryInterface(IID_SpellCheck, (void **)&pSpellCheck);
3) pDictionary->LoadLibrary(L”animal.dict”) //IDictionary的函数
pSpellCheck->CheckWord(L”lion”, &stringResult); //ISpellCheck的函数
//注:pUnknown是IUnknown *类型的,IUnknown是IDictionary,ISpellCheck这两个接口的基类接口,所以可以用pUnknown调用QueryInterface()来获得IDictionary,ISpellCheck的接口指针,从而可以调用在CDictionary中的相应的函数。注意,IDictionary的接口指针只能调用CDictionary从IDictionary接口继承的函数,不能调用ISpellCheck的函数。同理ISpellCheck .
5.客户调用CoUninitialize(),在程序退出前,终止COM库服务函数。
如果有想和我一起学习和联系的: mkqu@comgi.com
32532824