- CoCreateInstance(....)
- {
-
- IClassFactory*pClassFactory=NULL;
-
CoGetClassObject(CLSID_Object,CLSCTX_INPROC_SERVER,NULL,IID_IClassFactory,(void**)&pClassFactory);
-
pClassFactory->CreateInstance(NULL,IID_IUnknown,(void**)&pUnk);
- pClassFactory->Release();
-
- }
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(.....)
- {
-
-
-
-
- }
-
-
- DllGetClassObject(...)
- {
-
-
CFactory*pFactory=newCFactory;
-
pFactory->QueryInterface(IID_IClassFactory,(void**)&pClassFactory);
-
- pFactory->Release();
-
- }
-
- CFactory::CreateInstance(.....)
- {
-
-
CObject*pObject=newCObject;
-
pObject->QueryInterface(IID_IUnknown,(void**)&pUnk);
- pObject->Release();
-
- }
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();
//...........
}
这部分我们将构造一个创建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();
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();
- CoCreateInstance(....)
- {
- .......
- IClassFactory*pClassFactory=NULL;
-
CoGetClassObject(CLSID_Object,CLSCTX_INPROC_SERVER,NULL,IID_IClassFactory,(void**)&pClassFactory);
-
pClassFactory->CreateInstance(NULL,IID_IUnknown,(void**)&pUnk);
- pClassFactory->Release();
- ........
- }
CoCreateInstance(....)
{
.......
IClassFactory *pClassFactory=NULL;
CoGetClassObject(CLSID_Object, CLSCTX_INPROC_SERVER, NULL, IID_IClassFactory, (void **)&pClassFactory);
pClassFactory->CreateInstance(NULL, IID_IUnknown, (void**)&pUnk);
pClassFactory->Release();
........
}
这就是一个典型的创建COM组件的框架,不过我的兴趣在CoCreateInstance身上,让我们来看看它内部做了一些什么事情。以下是它内部实现的一个伪代码:
- CoGetClassObject(.....)
- {
-
-
-
-
- }
- DllGetClassObject是干什么的,它是用来获得类厂对象的。只有先得到类厂才能去创建组件.
- 下面是DllGetClassObject的伪码:
- DllGetClassObject(...)
- {
- ......
-
CFactory*pFactory=newCFactory;
-
pFactory->QueryInterface(IID_IClassFactory,(void**)&pClassFactory);
-
- pFactory->Release();
- ......
- }
- CoGetClassObject的流程已经到此为止,现在返回CoCreateInstance,看看CreateInstance的伪码:
- CFactory::CreateInstance(.....)
- {
- ...........
-
CObject*pObject=newCObject;
-
pObject->QueryInterface(IID_IUnknown,(void**)&pUnk);
- pObject->Release();
- ...........
- }
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();
...........
}
这段话的意思就是先得到类厂对象,再通过类厂创建组件从而得到IUnknown指针。继续深入一步,看看CoGetClassObject的内部伪码:
上图是从COM+技术内幕中COPY来的一个例图,从图中可以清楚的看到CoCreateInstance的整个流程。
(7) 一个典型的自注册的COM DLL所必有的四个函数
DllGetClassObject:用于获得类厂指针
DllRegisterServer:注册一些必要的信息到注册表中
DllUnregisterServer:卸载注册信息
DllCanUnloadNow:系统空闲时会调用这个函数,以确定是否可以卸载DLL
DLL还有一个函数是DllMain,这个函数在COM中并不要求一定要实现它,但是在VC生成的组件中自动都包含了它,它的作用主要是得到一个全局的实例对象。
(8) 注册表在COM中的重要作用
首先要知道GUID的概念,COM中所有的类、接口、类型库都用GUID来唯一标识,GUID是一个128位的字串,根据特制算法生成的GUID可以保证是全世界唯一的。 COM组件的创建,查询接口都是通过注册表进行的。有了注册表,应用程序就不需要知道组件的DLL文件名、位置,只需要根据CLSID查就可以了。当版本升级的时侯,只要改一下注册表信息就可以神不知鬼不觉的转到新版本的DLL。
分享到:
相关推荐
COM笔记-CoCreateInstance 很有用的 开发参考 比如 CoCreateInstance(CLSID_VideoRenderer,0,CLSCTX_ALL,IID_IBaseFilter,(void**)&pPreview);这里面的参数是什么意思 ?这个文档可以告诉你。。 欢迎联系:393877568
贡献两本COM技术的两本经典的书籍,两本书的风格不太一样,看个人口味吧。谢谢下载!
COM编程接口演示,取指针_整数,取指针_字节集,A2W,Unicode转Ansi,GetRunPath,SetWindowText,CallPointer,AddPush,AddCall,AddLong,AddByte,GetWallpaper,SetWallpaper,IIDFromString,CoCreateInstance,CallWindowProc...
TAPI3.0 C#例子,用电脑打电话。
易语言墙纸操作源码系统结构:取变量地址,到可变字符,运行子程序,到宽字符,读数,设置墙纸,CoCreateInstance,IIDFromString,CoInitialize,StringFromIID,MultiByteToWideChar,取文本地址,取字节集地址,取整数
• 深 入CoCreateInstance()——探究CoCreateInstance()的调用机理 • COM 服务器的注册——描述完成服务器注册所需要的注册表入口 • 创 建COM对象——类工厂——描述创建客户端要使用的COM对象的过程 • 一 个定制...
具体查 MSDN --IDispEventImpl (2) 添加映射项 BEGIN_SINK_MAP(CFileMonitorSink) SINK_ENTRY_EX( 0, __uuidof(_IFun1Events), 1, OnNotify) //0 唯一标识符,用于区别 连接到 事件源的多个客户端 同上 , 1, ...
通过一个简单的组件实现两个接口,CoCreateInstance 调用 DLLGetClassObject返回相应的组件类厂 类厂调用CreateInstance创建组件 用DLLRegisterServer向注册表中加一个组件ID,前提是要对注册表中CLSID下的结构有...
vc mfc 基于directshow实现usb摄像头预览拍照及下载图片 ,以调用CoCreateInstance创建一个新的捕获Graph Builder和Filter Graph Manager开始。随后通过给定Filter Graph Manager的IgraphBuilder接口指针作为参数...
7.2.3 CoCreateInstance与CoGetClassObjet的比较 109 7.2.4 类厂的若干特性 110 7.3 类厂的实现 110 7.3.1 DllGetClassObject的使用 111 7.3.2 组件的创建过程 111 7.3.3 组件代码清单 112 7.3.4 流程控制 ...
易语言COM组件支持模块全套源码
c c++头文件集合
使用OPC SI7 S7-300与iFIX 通讯pdf,使用OPC SI7 S7-300与iFIX 通讯
vb6之CoCreateInstanceEx加载Com对象中国第一个,其他下载的全是VC++等代码,外国网站不让访问,我们百度能搜到的全是旧信息,中国这样怎么发展?
XMLHttpRequest中文参考手册(15)
CoCreateInstance / CoCreateInstanceEx 函数 COM 库的初始化 COM 库的内存管理 组件程序的装载和卸载 COM 库常用函数 HRESULT 类型 ⊙ 第四章 COM 特性 可重用性:包容和聚合 进程透明性 (待学) 安全性 ...
当我们用VC++ ATL 工程创建了一个COM 工程,实现了一个自己的COM 对象,又在另一个程序中CoCreateInstance 这个COM 对象时,不知你是否想过这样的问题:COM 对象是用C++类对象实现的,但是,我们从来没有在自己的...
3.4.1.2 CoCreateInstance 3.4.1.3 CoCreateInstanceEx 3.4.2 如何调用进程内组件 3.4.3 COM客户调用进程外组件 3.5 进一步认识COM 3.5.1 可重用机制:包容和聚合 3.5.2 进程透明性 3.5.3 安全性机制 小结 第4章 ...
具体如下: 这里使用BCB 在使用TADOConnect等组件时需要进行初始化 调用接口 : CoInitialize(NULL);//初始化COM套件 CoUninitialize();//释放COM套件 在DLL入口中调用: static bool isCoInitialize = false; //...
防止向U盘中拷贝文件, Hook Win32API, 实现在WinXp下U盘 DLP Hook函数列表:CopyFileExW Win7(x86/x64)下U盘DLP Hook函数列表: CoCreateInstance, IFileOperation::CopyItems IFileOperation::MoveItems ...