CocreateInstance 是一个关键的 API
CocreateInstance
是一个关键的 API,它可以创建一个指定的 COM 对象,并且可以关联到特定的接口。
一、简介
CocreateInstance
是一个很常见的 API,在开发 Windows 应用程序时经常用到。使用 CocreateInstance
可以创建一个指定的 COM 对象,这个对象在系统中被描述成一个唯一的 GUID。
一个 COM 对象需要支持多个接口,因此,开发者需要在创建 COM 对象时指定哪个接口将被使用。这些接口通过 GUID 来识别,因此,调用 CocreateInstance
时需要指定 GUID。
关于 COM 对象和接口的概念,可以参考以下代码:
// 创建一个COM对象
CoCreateInstance(CLSID_MyObject, NULL, CLSCTX_INPROC_SERVER, IID_IMyInterface, (void**)&pMyObject);
// IMyInterface是COM对象实现的一个接口,定义如下:
interface IMyInterface
{
virtual void Function1() = 0;
virtual void Function2() = 0;
};
二、使用方式
使用 CocreateInstance
创建一个 COM 对象需要传入四个参数,分别是:
clsid
:指定要创建的 COM 对象的 CLSIDpUnkOuter
:预留参数,用于支持对象的聚合dwClsContext
:指定 COM 服务器应该在哪个上下文中运行riid
:要创建的 COM 对象所支持的接口的 IID 注意,CocreateInstance
创建对象时会调用CoGetClassObject
API,这个 API 会查询在 Windows 注册表中查找指定 CLSID 的 COM 对象信息,然后会加载这个对象并返回指向它的指针。 代码演示:
// 创建一个COM对象
HRESULT hr = CoCreateInstance(CLSID_MyObject, NULL, CLSCTX_INPROC_SERVER, IID_IMyInterface, (void**)&pMyObject);
if (FAILED(hr))
{
// COM对象创建失败
}
三、实用技巧
1. 利用运行时类型库
运行时类型库(Type Library)是一个 COM 对象的元数据,包含它的类、接口、方法和属性等信息,可以通过 OLE/COM Object Viewer 等工具来查看。
在使用 CocreateInstance
时,如果你知道要创建的 COM 对象使用的是哪个接口,但是并不知道这个接口对应的 IID 是什么,可以借助运行时类型库来查找。
代码演示:
// 创建一个COM对象
HRESULT hr = CoCreateInstance(CLSID_MyObject, NULL, CLSCTX_INPROC_SERVER, __uuidof(IMyInterface), (void**)&pMyObject);
if (FAILED(hr))
{
// COM对象创建失败
}
2. 处理错误
CocreateInstance
失败时会返回一个错误码,这时开发者需要根据错误码来确定错误的原因。
如果错误码是 CLASS_E_CLASSNOTAVAILABLE
,说明指定的 CLSID 没有被注册或者运行。如果错误码是 CO_E_DLLNOTFOUND
,说明指定的 COM 服务器不存在。
代码演示:
// 创建一个COM对象
HRESULT hr = CoCreateInstance(CLSID_MyObject, NULL, CLSCTX_INPROC_SERVER, IID_IMyInterface, (void**)&pMyObject);
if (FAILED(hr))
{
if (hr == CLASS_E_CLASSNOTAVAILABLE)
{
// 指定的CLSID没有被注册或者运行
}
if (hr == CO_E_DLLNOTFOUND)
{
// 指定的COM服务器不存在
}
// 其他错误处理
}
3. 在多线程环境中使用
在多线程环境中使用 CocreateInstance
需要注意几点:
- 在调用
CocreateInstance
之前需要先调用CoInitialize
或CoInitializeEx
来初始化 COM 库。 - 需要在创建对象之前先将线程设置为单线程模式,即调用
CoMarshalInterThreadInterfaceInStream
或者CoInitializeEx
的COINIT_APARTMENTTHREADED
标记。 - 需要在创建对象之后调用
CoInitializeSecurity
来设置安全上下文。 代码演示:
// 初始化COM库
CoInitialize(NULL);
// 设置线程为单线程模式
CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
// 创建COM对象
HRESULT hr = CoCreateInstance(CLSID_MyObject, NULL, CLSCTX_INPROC_SERVER, IID_IMyInterface, (void**)&pMyObject);
if (FAILED(hr))
{
// COM对象创建失败
}
// 设置安全上下文
CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_DEFAULT,
RPC_C_IMP_LEVEL_IDENTIFY, NULL, EOAC_NONE, NULL);
// 释放COM对象
pMyObject->Release();
// 释放COM库
CoUninitialize();
四、总结
在 Windows 应用程序开发中,CocreateInstance
是一个重要的 API,可以用来创建指定的 COM 对象,并支持多个接口。在使用 CocreateInstance
时,需要指定 CLSID 和 IID,并且需要处理错误和在多线程环境中使用时需要注意多个细节。