CoCreateInstance用法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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连接到客户。
由于进程内的服务器是最容易实现的,因此我们在这个例子中选用它来讲解。
通常客户端都不用关心服务器是如何实现的。
这时它将使用CLSCTX_SERVER的值,该服务器可以是一个本地的或者是进程内的。
接着是接口的标识符或者IID。
这是另一个GUID--用来标识我们请求的接口。
我们请求的IID必须是存在的,即被由CLSID指定的COM类支持。
再次,IID的值通常由一个头文件提供,或者使用接口名查找出来。
最后的参数是指向一个接口的指针。
CoCreateInstance() 将创建所请求的类对象和接口,并且返回一个指向接口的指针。
这个参数也是CoCreateInstance调用的目的。
然后我们就可以使用该接口指针来调用服务器上方法。
COM笔记-CoCreateInstance
2010-06-11 23:39:00| 分类:COM/ATL | 标签:|字号大中小订阅
CoCreateInstance
创建组件的最简单的方法是使用CoCreateInstance函数。
在COM库中包含一个用于创建组件的名为CoCreateInstance的函数。
此函数需要一个CLSID参数,在此基础上创建相应组件的一个实例,并返回此组件的某个接口。
CoCreateInstance 的声明
HRESULT_stdcall CoCreateInstance(REFCLSID rclsid,
LPUNKNOWN pUnkOuter,
DWORD dwClsContext,
REFIID riid,
LPVOID * ppv);
第一个参数:待创建组件的CLSID。
第二个参数:用于聚合组件。
第三个参数:dwClsContext的作用是限定所创建的组件的执行上下文。
第四个参数:iid为组件上待使用的接口的iid。
CoCreateInstance 将在最后一个参数中返回此接口的指针。
通过将一个IID传给
CoCreateInstance,客户将无需在创建组件之后去调用其QueryInterface函数。
CoCreateInstance的使用
// Create component.
IX *pIX = NULL;
HRESULT hr = ::CoCreateInstance(CLSID_Companent1,
NULL,
CLSCTX_INPROC_SERVER,
IID_IX,
(void **)&pIX);
if (SUCCEEDED(hr))
{
pIX->Fx();
pIX->Release();
}
CLSCTX_INPROC_SERVER值告诉CoCreateInstance只装载包含进程中服务器或DLL
中的组件。
类上下文
CoCreateInstance的第三个参数dwClsContext可以控制所创建的组件是在与客户相同的进程中运行,还是在不同的进程中运行,或者是在另外一台机器上运行。
CLSCTX_INPROC_SERVER
客户希望创建在同一进程中运行的组件。
为能够同客户在同一进程中运行,组件必须是
在DLL中实现。
CLSCTX_INPROC_HANDLER
客户希望创建进程中处理器。
一个进程中处理器实际上是一只实现了某个组件一部分的进程中组件。
该组件的基体附录将由本地或远程服务器上的某个进程外组件实现。
SLSCTX_LOCAL_SERVER
客户希望创建一个在同一机器上的另外一个进程中运行的组件。
本地服务器是由EXE
实现的。
SLSCTX_REMOTE_SERVER
客户希望创建一个在远程机器上运行的组件。
此标志需要分布式COM正常工作。
{
hr = CoCreateInstance(CLSID_kuan,
NULL,
CLSCTX_INPROC_SERVER,
IID_Ikuan,
(void **)&IkuanATL);
//如果成功,则调用AddNumbers方法,否则显示相应的出错信息
if(SUCCEEDED(hr))
{
long ReturnValue;
IkuanATL->Add(8,9,&ReturnValue);
cout << "The answer for 8+9 is:" << ReturnValue << endl;
IkuanATL->Release();
}
else
{
cout << "CoCreateInstance Failed." << endl;
}
}
CoUninitialize();//释放COM
return0;
}
CoCreateInstance的不灵活性
CoCreateInstance创建组件的过程是:传给它一个CLSID,然后创建相应的组件,并返回指向所请求的接口指针。
它没有给客户提供一种能够控制组件创
建过程的方法。
当CoCreateInstance完成之后,组件实际上已经建立好了。
在建立好一个组件之后,想要控制将组件装载到内存中何处或检查客户是否有来创建该组件基本
上已经不可能了。