CoCreateInstanceEx 函数是 Windows API 中的一部分,用于创建 COM 对象的实例,类似于 CoCreateInstance 函数。不同之处在于,CoCreateInstanceEx 提供了更灵活的选项,允许在指定上下文中进行实例化。

以下是 CoCreateInstanceEx 函数的原型:
HRESULT CoCreateInstanceEx(
  REFCLSID              rclsid,
  IUnknown              *punkOuter,
  DWORD                 dwClsCtx,
  COSERVERINFO          *pServerInfo,
  ULONG                 cmq,
  MULTI_QI              *pResults
);

参数解释:

  •  rclsid:要创建的 COM 类的 CLSID。

  •  punkOuter:用于控制聚合的外部对象的 IUnknown 接口指针。如果不进行聚合,可以传递 nullptr。

  •  dwClsCtx:指定对象在其中运行的上下文。通常使用 CLSCTX_INPROC_SERVER 或 CLSCTX_LOCAL_SERVER。

  •  pServerInfo:一个 COSERVERINFO 结构,用于指定服务器信息。如果不需要,可以传递 nullptr。

  •  cmq:指定 pResults 数组中元素的数量。

  •  pResults:一个 MULTI_QI 结构数组,用于存储请求的接口指针。


函数返回 HRESULT 类型的值。如果操作成功,返回 S_OK,否则返回相应的错误代码。

CoCreateInstanceEx 的使用相对较复杂,因为它允许同时请求多个接口,并提供更多的定制选项。以下是一个简化的示例:
#include <Windows.h>
#include <Combaseapi.h>
#include <iostream>

int main() {
    CLSID clsid;
    IID iid = IID_IUnknown;  // 示例请求 IUnknown 接口
    IUnknown *pUnknown = nullptr;

    // 示例:Excel.Application 的 CLSID
    CLSIDFromProgID(L"Excel.Application", &clsid);

    COSERVERINFO serverInfo;
    memset(&serverInfo, 0, sizeof(COSERVERINFO));
    serverInfo.pwszName = L"";
    serverInfo.dwReserved1 = 0;
    serverInfo.dwReserved2 = 0;

    MULTI_QI multiQI;
    memset(&multiQI, 0, sizeof(MULTI_QI));
    multiQI.pIID = &iid;
    multiQI.pItf = nullptr;
    multiQI.hr = S_OK;

    HRESULT hr = CoCreateInstanceEx(clsid, nullptr, CLSCTX_LOCAL_SERVER, &serverInfo, 1, &multiQI);

    if (SUCCEEDED(hr)) {
        std::cout << "COM object instance created successfully." << std::endl;

        // 在此使用 multiQI.pItf 进行进一步的操作

        multiQI.pItf->Release();  // 释放对象
    } else {
        std::cerr << "Failed to create COM object instance. Error code: 0x" << std::hex << hr << std::endl;
    }

    return 0;
}

在这个示例中,COSERVERINFO 结构用于指定服务器信息,MULTI_QI 结构用于存储请求的接口指针。请注意,实际使用时可能需要更详细的定制和错误处理。


转载请注明出处:http://www.pingtaimeng.com/article/detail/24565/Win32 API/Combaseapi.h/CoCreateInstanceEx