📅  最后修改于: 2023-12-03 14:56:50.614000             🧑  作者: Mango
组件对象模型(COM)是一种面向对象的二进制接口标准,允许动态链接库(DLL)和可执行文件(EXE)之间的交互。COM 对象具有自己的生命周期,这在掌握 COM 编程时非常重要。
COM 对象有五个不同的状态:
COM 对象的创建由其类工厂类(Class factory)完成,类工厂负责创建 COM 对象,并返回 COM 对象的指针。创建 COM 对象的方法有很多种,常用的方法是调用 CoCreateInstance 函数。以下是一个 C++ 的示例代码:
CoInitialize(NULL);
IMyObject* pObject = NULL;
HRESULT hr = CoCreateInstance(CLSID_MyObject, NULL, CLSCTX_ALL, IID_IMyObject, (void**)&pObject);
if (SUCCEEDED(hr))
{
// 使用 COM 对象
pObject->Method1();
pObject->Method2();
// 释放 COM 对象
pObject->Release();
}
CoUninitialize();
COM 对象支持多个客户端共享,因此每个客户端都需要获取一个对 COM 对象的引用。客户端可以调用 QueryInterface 函数获取对象的接口指针。以下是一个 C++ 的示例代码:
IMyObject* pObject = NULL;
HRESULT hr = CoCreateInstance(CLSID_MyObject, NULL, CLSCTX_ALL, IID_IMyObject, (void**)&pObject);
if (SUCCEEDED(hr))
{
// 获取 IMyInterface 接口
IMyInterface* pInterface = NULL;
hr = pObject->QueryInterface(IID_IMyInterface, (void**)&pInterface);
if (SUCCEEDED(hr))
{
// 使用 IMyInterface 接口
pInterface->Method3();
pInterface->Method4();
// 释放 IMyInterface 接口
pInterface->Release();
}
// 释放 COM 对象
pObject->Release();
}
COM 对象的释放分为两个步骤:释放所有接口指针和释放对象本身。释放所有接口指针应通过调用每个接口的 Release 函数来实现。当对象没有被任何对象引用时,要调用对象的 Release 函数释放对象本身。以下是一个 C++ 的示例代码:
IMyObject* pObject = NULL;
HRESULT hr = CoCreateInstance(CLSID_MyObject, NULL, CLSCTX_ALL, IID_IMyObject, (void**)&pObject);
if (SUCCEEDED(hr))
{
// 使用 COM 对象
pObject->Method1();
pObject->Method2();
// 释放 COM 对象
pObject->Release();
}
COM 对象的生命周期是 COM 编程中必须掌握的基本知识。创建、获取引用和释放 COM 对象的过程必须遵循 COM 的规范。只有这样才能在 COM 编程中有效地管理对象和接口,避免内存泄漏和程序崩溃。