COM对象的创建

举报
Rolle 发表于 2024/10/15 22:49:42 2024/10/15
【摘要】 组件对象模型(COM)是微软推出的一种软件组件技术,它允许不同的软件组件在多种编程语言中被创建和调用。COM对象的创建是COM编程中的一个核心主题,涉及到类厂的实现、对象的实例化以及COM对象的生命周期管理。本文将深入探讨COM对象的创建过程,包括相关的COM接口、类厂的作用以及如何在实际开发中创建和管理COM对象。COM对象创建概述在COM中,对象的创建通常涉及以下几个关键步骤:类厂的获取...

组件对象模型(COM)是微软推出的一种软件组件技术,它允许不同的软件组件在多种编程语言中被创建和调用。COM对象的创建是COM编程中的一个核心主题,涉及到类厂的实现、对象的实例化以及COM对象的生命周期管理。本文将深入探讨COM对象的创建过程,包括相关的COM接口、类厂的作用以及如何在实际开发中创建和管理COM对象。

COM对象创建概述
在COM中,对象的创建通常涉及以下几个关键步骤:

类厂的获取:客户端首先需要获取一个类厂(Class Factory)的实例,类厂负责创建特定类型的COM对象。
对象的实例化:通过类厂的CreateInstance方法,客户端可以请求创建一个COM对象的实例。
接口指针的获取:对象创建后,客户端通过接口指针与COM对象进行交互。
对象的生命周期管理:客户端需要管理COM对象的生命周期,包括增加和释放引用计数。
关键COM接口
IClassFactory接口
IClassFactory接口是所有类厂必须实现的接口,它定义了创建COM对象实例和锁定服务器的方法。

代码语言:javascript
interface IClassFactory : public IUnknown
{
virtual HRESULT CreateInstance(IUnknown *pUnkOuter, REFIID riid, void **ppvObject) = 0;
virtual HRESULT LockServer(BOOL fLock) = 0;
};
CreateInstance方法用于创建COM对象的实例。如果pUnkOuter非空,则表示请求聚合。
LockServer方法用于控制组件的锁定状态,影响组件的卸载行为。
IUnknown接口
IUnknown接口是所有COM接口的基接口,它定义了三个基本方法:QueryInterface、AddRef和Release。

代码语言:javascript
interface IUnknown
{
virtual HRESULT QueryInterface(REFIID riid, void **ppvObject) = 0;
virtual ULONG AddRef() = 0;
virtual ULONG Release() = 0;
};
QueryInterface方法用于获取对象的其他接口指针。
AddRef和Release方法用于管理对象的引用计数。
类厂的实现与获取
类厂的实现通常涉及以下步骤:

实现IClassFactory接口:创建一个类继承自IClassFactory并实现其方法。
导出DllGetClassObject函数:在DLL中实现并导出DllGetClassObject函数,该函数负责创建类厂实例。
注册类厂:在Windows注册表中注册类厂的相关信息,包括CLSID和ProgID。
DllGetClassObject函数
DllGetClassObject函数是DLL的入口点,用于创建类厂对象。

代码语言:javascript
STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppv);
rclsid参数指定了要创建的COM类的CLSID。
riid参数通常为IID_IClassFactory。
ppv参数用于接收类厂对象的接口指针。
COM对象的创建过程
以下是一个COM对象创建的示例流程:

获取类厂:客户端调用CoGetClassObject或DllGetClassObject获取类厂的IClassFactory指针。
创建对象:客户端调用类厂的CreateInstance方法创建COM对象实例。
获取接口指针:客户端通过QueryInterface获取所需的接口指针。
管理生命周期:客户端通过AddRef和Release管理对象的生命周期。
示例代码
代码语言:javascript
// 客户端代码
IClassFactory *pClassFactory = nullptr;
IUnknown *pUnknown = nullptr;

// 获取类厂
HRESULT hr = CoGetClassObject(CLSID_MyComObject, CLSCTX_INPROC_SERVER, nullptr, IID_IClassFactory, (void**)&pClassFactory);
if (SUCCEEDED(hr))
{
// 创建对象
hr = pClassFactory->CreateInstance(nullptr, IID_IUnknown, (void**)&pUnknown);
if (SUCCEEDED(hr))
{
// 使用对象
// …

    // 释放接口指针
    pUnknown->Release();
}
// 释放类厂
pClassFactory->Release();

}
COM对象的生命周期管理
COM对象的生命周期管理主要涉及引用计数的增加和减少。当对象的引用计数降至零时,对象会自动销毁并释放资源。

引用计数
增加引用:每次通过QueryInterface或AddRef成功获取接口指针时,必须调用AddRef增加引用计数。
减少引用:当不再需要接口指针时,必须调用Release减少引用计数。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。