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减少引用计数。
- 点赞
- 收藏
- 关注作者
评论(0)