📜  组件对象模型(COM)对象的生命周期(1)

📅  最后修改于: 2023-12-03 14:56:50.614000             🧑  作者: Mango

组件对象模型(COM)对象的生命周期

组件对象模型(COM)是一种面向对象的二进制接口标准,允许动态链接库(DLL)和可执行文件(EXE)之间的交互。COM 对象具有自己的生命周期,这在掌握 COM 编程时非常重要。

COM 对象生命周期

COM 对象有五个不同的状态:

  1. 未创建状态(Uninitialized state):对象未创建或已释放。
  2. 未连接状态(Disconnected state):对象创建后,正在等待客户端连接。
  3. 连接状态(Connected state):对象和客户端之间建立了连接。
  4. 正在释放状态(Being released state):客户端释放了对象,但对象可能仍在被其他对象引用。
  5. 已释放状态(Released state):对象没有被任何对象引用。
创建 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 对象支持多个客户端共享,因此每个客户端都需要获取一个对 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 对象

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 编程中有效地管理对象和接口,避免内存泄漏和程序崩溃。