继续看《COM技术内幕》
这几天看《COM技术内幕》,真是看得头晕脑胀。难道COM这么难学吗?觉得自己坚持力度不够,再难也要搞下去,非掌握它不可!
一,CoCreateInstance函数,函数原型如下:
书上说这个函数是COM库函数中创建COM最简单的方式,也是用得最多的一种方式,但缺点是不够灵活。所以,引入了类厂来创建组件。
关于它的使用方法,与QueryInterface差不多,如:
一,CoCreateInstance函数,函数原型如下:
STDAPI CoCreateInstance(
REFCLSID rclsid,
LPUNKNOWN pUnkOuter,
DWORD dwClsContext,
REFIID riid,
LPVOID * ppv
);
REFCLSID rclsid,
LPUNKNOWN pUnkOuter,
DWORD dwClsContext,
REFIID riid,
LPVOID * ppv
);
书上说这个函数是COM库函数中创建COM最简单的方式,也是用得最多的一种方式,但缺点是不够灵活。所以,引入了类厂来创建组件。
关于它的使用方法,与QueryInterface差不多,如:
IX* pIX=NULL;
HRESULT hr = CoCreateInstance(CLISD.Component1,
NULL,
CLSCTX_INPROC_SERVER,
IID_IX,
(void**)&pIX);
if(SUCCEEDED(hr))
{
pIX->Fx();
pIX->Release();
}
HRESULT hr = CoCreateInstance(CLISD.Component1,
NULL,
CLSCTX_INPROC_SERVER,
IID_IX,
(void**)&pIX);
if(SUCCEEDED(hr))
{
pIX->Fx();
pIX->Release();
}
第一个参数是创建组建的CLSID,第二个参数是用于聚合组件,第三个参数是创建组件的执行上下文,第四个是接口的IID,第五个返回接口的指针。
执行上下文就是指控制所创建的组件是与客户相同的进程中运行,还是在不同的进程中运行,详情可查看MSDN。
下面讲为什么要引入类厂的概念:
在任何面向对象的系统中,对象的创建都是非常重要的,因为在能够使用某个对象前,必须先创建它。若个各对象的创建方法都不尽相同,那么想要对对象的一致处理将是十分困难的事情。因此我们希望创建对象的过程尽可能灵活,以便按照相似的方式创建所有的组件。创建过程越灵活,那么越将能适应更多组件的需求。
CoCreateInstance缺点是没有给客户提供一种能够控制组件创建过程的方法,当CoCreateInstance调用完成后,组建实际上已经创建好了,在建立好组件后,想要控制将组件装载到内存中的何处以及检查客户是否有权限来创建组件基本上是不可能了。总之,CoCreateInstance不够灵活。
解决这个问题的方法就是使用一个专门用于创建组件的组件。这个组件就是类厂
要