现在的位置: 首页 > 综合 > 正文

COM学习笔记一《用VC进行COM编程所必须掌握的理论知识》

2013年05月11日 ⁄ 综合 ⁄ 共 2109字 ⁄ 字号 评论关闭

  1   要用COM

OO vs. COM —— 重用的方法不同
1类库 —— 类库的重用基于源的方式
限制了
次都必重新编译
2DLL ——
函数重名问题
编译C++函数的名称修不兼容问题(也可以用extern "C";来强调使用准的C函数特性,关闭功能,但这样失了C++的重性功能)
路径问题
④ DLLEXE的依赖问题
2   COM实际上是一个C++,而接口都是件从接口派生而来。COM件是以 C++的,特重要的是虚函数和多的概念,COM中所有函数都是虚函数,都必虚函数表VTable用。
3   COM件有三个最基本的接口,分IUnknownIClassFactoryIDispatch
COM定任何件、任何接口都必IUnknown承,IUnknown包含三个函数,分QueryInterfaceAddRefRelease三个函数是无比重要的,而且它的排列序也是不可改的。
IClassFactory的作用是COM件。件都必有一个与之相厂,厂知道怎么样创件,当客户请求一个象的实际求交厂,由例,然后把例指程序。IClassFactory最重要的一个函数就是CreateInstance名思就是例。
IDispatch叫做度接口。度接口把一个函数一个属性都上号,客程序要些函数属性的侯就把传给IDispatch接口就行了,IDispatch再根据用相的函数,此而已。
4   COM件有三程内、本地、程。于后两者情况必须调度接口指及函数参数。
5   COM件的核心是IDL
6   COM件的运行机制

IUnknown *pUnk=NULL;
IObject *pObject=NULL;
CoInitialize(NULL);
CoCreateInstance(CLSID_Object, CLSCTX_INPROC_SERVER, NULL, IID_IUnknown, (void**)&pUnk);
pUnk->QueryInterface(IID_IOjbect, (void**)&pObject);
pUnk->Release();
pObject->Func();
pObject->Release();
CoUninitialize();
就是一个典型的COM件的框架,不我的趣在CoCreateInstance身上,来看看它内部做了一些什事情。以下是它内部实现的一个

CoCreateInstance(....)
{
.......
IClassFactory *pClassFactory=NULL;
CoGetClassObject(CLSID_Object, CLSCTX_INPROC_SERVER, NULL, IID_IClassFactory, (void **)&pClassFactory);
pClassFactory->CreateInstance(NULL, IID_IUnknown, (void**)&pUnk);
pClassFactory->Release();
........
}
的意思就是先得到象,再通过类件从而得到IUnknown继续深入一,看看CoGetClassObject的内部伪码

CoGetClassObject(.....)
{
//过查注册表CLSID_Object,得知DLL的位置、文件名
//
装入DLL
//
使用函数GetProcAddress(...)得到DLL中函数DllGetClassObject的函数指
//
DllGetClassObject
}   
DllGetClassObject是干什的,它是用来象的。只有先得到厂才能去.下面是DllGetClassObject伪码

DllGetClassObject(...)
{
......
CFactory* pFactory= new CFactory; //

pFactory->QueryInterface(IID_IClassFactory, (void**)&pClassFactory);
//
查询IClassFactory
pFactory->Release();
......
}
CoGetClassObject的流程已到此止,在返回CoCreateInstance,看看CreateInstance伪码

CFactory::CreateInstance(.....)
{
...........
   CObject *pObject = new CObject; //
   pObject->QueryInterface(IID_IUnknown, (void**)&pUnk);
   pObject->Release();
   ...........
}
7   注册表问题
 

抱歉!评论已关闭.