您的位置:首页 > 其它

创建COM对象

2016-02-17 10:31 225 查看
成功初始化COM库之后,线程就可以安全使用COM接口了。为了能够使用COM接口,你的程序首先应该创建一个实现接口的对象。一般来说,有两种方式创建COM对象:
1.实现模块会提供创建对象的方法
2.COM提供了一个函数CoCreateInstance
例如,在什么是COM接口的文章中,Shape对象实现了IDrawable接口,下面将介绍第一种方法创建COM对象。


// Not an actual Windows function.

HRESULT CreateShape(IDrawable** ppShape);


有了上面的函数,你就可以创建一个COM对象了。


IDrawable *pShape;

HRESULT hr = CreateShape(&pShape);
if (SUCCEEDED(hr))
{
// Use the Shape object.
}
else
{
// An error occurred.
}


接下来极少第二种创建COM对象的方法,也就是利用CoCreateInstance()函数来实现。CoCreateInstance函数提供了一种创建COM对象的通用机制。为了更好的理解与应用CoCreateInstance,你需要记住的是:两个COM对象可以实现同样的接口,一个COM对象也可以实现多个COM接口。那么,我们要如何指定我们创建的对象的类型呢?在COM中,任何一个对象或者接口都可以用一个128位的数字指定,即GUID,或者UUID。现已经有一些创建UUID的算法。
例如,Shape可以声明两个UUID的常量。


extern const GUID CLSID_Shape;
extern const GUID IID_IDrawable;


其中,第一个常量用来标明Shape对象,第二个常量用来标明IDrawable接口,CLSID是类标识符,而IID是接口标识符。有了这些标识符,现在你就可以创建Shape实例了。


IDrawable *pShape;
hr = CoCreateInstance(CLSID_Shape, NULL, CLSCTX_INPROC_SERVER, IID_Drawable,
reinterpret_cast<void**>(&pShape));

if (SUCCEEDED(hr))
{
// Use the Shape object.
}
else
{
// An error occurred.
}


CoCreateInstance()函数有五个参数。第一个和第四个参数是类标识符和接口标识符。这两个参数的作用是告诉函数要创建一个一个Shape对象,请求分配一个指向IDrawable接口的指针。
设置第二个参数为NULL。第三个参数设置了一系列的标识符,这些标识符的主要目的是指定对象执行的内容。执行内容指定了对象在程序运行期间,该对象是否运行在同样的进程中,是否运行在同一台机器的不同进程中,或者运行在不同机器上。下面的表格给出了这个参数最常见的值。


Flag Description

CLSCTX_INPROC_SERVER Same process.

CLSCTX_LOCAL_SERVER Different process, same computer.

CLSCTX_REMOTE_SERVER Different computer.

CLSCTX_ALL Use the most efficient option that the object supports. (The ranking, from most efficient to least efficient, is: in- process, out-of-process, and cross-computer.)

第五个参数用来接收接口的指针,由于该函数是通用机制,故而数据类型是void**,调用者必须强制使得指针的地址变为void**。此外,检查该函数的返回值也是很有必要的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: