COM原理
+ -

COM 类厂和DllGetObjectClass函数

2022-02-07 65 0

类厂是COM对象的生产基地,COM库通过类厂创建COM对象;对应每一个COM类,都有一个类厂,用于该COM类的对象创建操作。类厂本身也是一个COM对象,它支持一个特殊接口(IClassFactory):

class IClassFactory:public IUnknown
{
    virtual HRESULT _stdcall CreateInstance(IUnknown * pUnknownOuter,const IID& iid,void ** ppv)= 0;
    virtual HRESULT _stdcall LockServer(BOOL bLock)= 0;
}
  • CreateInstance用于创建对应的COM对象。第一个参数pUnknownOuter用于对象类被聚合的情形,一般设为NULL;第二个参数iid是对象创建完成后,客户请求的接口IID;第三个参数ppv存放返回的接口指针。
  • LockServer用于控制组件的生存期。类厂对象是由DLL导出函数DllGetClassObject创建的。

原型:HRESULT DllGetClassObject(const CLSID& clsid,const IID& iid,(void **)ppv);
DllGetClassObject的第一个参数为待创建对象的CLSID。因为一个组件可能实现了多个COM对象类,所以在DllGetClassObject参数中有必要指定CLSID,以便创建正确的类厂。另两个参数iid和ppv分别指于指定接口IID和存放类厂接口指针
COM库在接到对象创建指令后,调用进程内组件的DllGetClassObject,由该函数创建类厂对象,并返回类厂对象的接口指针。COM库或客户一旦拥有类厂的接口指针,就可通过IClassFactory成员函数CreateInstance创建相应的COM对象。

0 篇笔记 写笔记

使用CLSIDFromString将字符串GUID转化成十六进制GUID/UUID
Windows的一般会给相同类型的设备接口注册相同的GUID,但GUID有时别人给的是一个字符串,但是在实际使用过程中我们又使用的是GUID类型,其结构定义如下:typedef struct _GUID { unsigned long Data1; unsigned short ......
COM 类厂和DllGetObjectClass函数
类厂是COM对象的生产基地,COM库通过类厂创建COM对象;对应每一个COM类,都有一个类厂,用于该COM类的对象创建操作。类厂本身也是一个COM对象,它支持一个特殊接口(IClassFactory):class IClassFactory:public IUnknown{ virtua......
COMM CSID和GUID
Office的Word中可以插入EXCEL数据,我们知道是通过Word存储的复合文件功能来实现的。那么当WORD程序读取复合文件,遇到EXCEL数据时,它该如何启动Excel呢?启动后,又如何让Excel自己去读入、解析、显示xls数据呢?CLSID概念有一个非常简单的解决方案,那就是在对象数据的......
COM 根据CLSID获取ProgID
void GetProgID(){ CoInitialize(NULL); //{000209FF-0000-0000-C000-000000000046} = word.application LPOLESTR lpwProgID = NULL; ......
作者信息
我爱内核
Windows驱动开发,网站开发
好好学习,天天向上。
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

您的支持,是我们前进的动力!