2024年3月21日发(作者:)

CoCreateInstance

2008-09-25 13:33:44

标签:COM

COM客户端感兴趣的是它可以调用的函数,在COM中,你可以通过接口来访问一套有用的函

数。接口最简单的形式就是函数的一个集合。当我们得到COM服务器的一个接口时,我们就

得到了一个指向一套函数的指针。

通过调用CoCreateInstance()函数,你就可以得到一个接口的指针。这是一个非常强

大的函数,它可与COM子系统进行交互,并做以下的事情:

查找服务器

开始、载入或者连接到服务器

在服务器端创建一个COM对象

返回指向COM对象接口的一个指针

对于查找和访问接口,有两种数据类型是很重要的,它们是:CLSID和IID。它们都是

Globally Unique ID's (GUID's)。GUID's用作唯一辨认所有的COM类和接口。

为了得到某个特别的类和接口,你需要它的GUID。要得到GUID,有许多方法。通常我

们可以由服务器的头文件得到CLSID和IID。在我们的例子中,我们在源代码的开始部分使

用#defind语句定义了GUID。通过接口的一般名字来查找GUID也很方便的。

让我们得到接口指针的函数是CoCreateInstance。

hr = CoCreateInstance(

CLSID_BeepObj, // COM class id

NULL, // outer unknown

CLSCTX_INPROC_SERVER, // server INFO

IID_IBeepObj, // interface id

(void**)&IBeep ); // pointer to inter

第一个参数是一个GUID,它可唯一指定客户端需要使用的COM类。GUID或者CLSID是

COM类的标识符。世界上的每个COM类都有自己唯一的CLSID。COM将使用该ID来查找可产

生请求COM对象的服务器。一旦连接到服务器,将会创建该对象。

第二个参数是一个指针,它指向“outer unknown”。我们不会使用这个参数,因此传

送一个NULL。在涉及到“aggregation”(集合)概念时,outer unknown是很重要的。

aggregation可让一个接口直接调用另一个COM接口而无需通知客户端。aggregation和

containment是接口用来调用其它接口的两个方法。

第三个参数定义COM类的Context或者CLSCTX。该参数控制服务器的范围。我们可以

通过它来控制服务器是进程内的服务器,还是一个EXE或者是在远程的计算机上。CLSCTX

是一个位掩码,因此你可以混合几个值。这里我们使用的是CLSCTX_INPROC_SERVER--该服

务器将运行在本地的计算机,并且作为一个DLL连接到客户。由于进程内的服务器是最容易

实现的,因此我们在这个例子中选用它来讲解。