以下是 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.zyzy.cn/article/detail/24565/Win32 API/Combaseapi.h/CoCreateInstanceEx