描述:
1.请问com库和类厂有什么不同?
2.为什么com库先产生类厂对象,然后再由类厂对象产生com对象,如果直接由com库产生com对象不是更方便吗?
3.在一个实例中看到这样一段程序
extern "C" const GUID CLSID_Dictionary = { 0x54bf6567, 0x1007, 0x11d1,
{ 0xb0, 0xaa, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00} } ;
想知道这个GUID号是系统原有的,必须这么写,还是自己定义的,随便写多少都行?
帮小弟解释一下吧!!
解决方案1:
学习!!!
解决方案2: 1.COM库的概念我不是很清楚,或许是SCM,如果是,它属于操作系统的一部分,用来响应请求来装载DLL的。
类厂是每个可创建的COM类中必须存在的,如果用类比的话,它类似于MFC中的用RTTI功能的MFC类,在这样的类中会存在一个CRunTimeClass 的静态变量。在ATL的实现中,通过继承CComClass,而在MFC中,是通过用DECLARE_OLECREATE等这样的宏为类加入了一个COleObjectFactory型的静态变量来完成的。
2.COM类是无法欲知,除了它遵从COM的规范外,它与我们在DLL中导出的类不同,我们导出的类是由我们自己来为它分配内存,在堆或者栈上,例如:
class __declspec(dllimport) A;
int main()
{
A a; //此处对A的实例分配内存
}
而在COM中类似的情况是这样的。
int main()
{
IA *pA;
HRESULT hr = CoCreateInstance(CLSID_A,NULL,CLSCTX_ALL,IID_IA,(void **)&pA);
}
在客户端根本不需要知道类的信息。
这样就要有一个通用的机制,处理一些复杂的,不可预知的问题,例如为实例分配堆栈的大小。直接创建类就要求COM库要了解对象的信息,这是不可能实现的。所以要委托对于每个COM都存在的类厂去做这件事。而所有COM的类厂的是通用的。从而另COM库去使用相对简单的通用的类厂来创建COM。
3 这要看你是COM的开发者还是COM的使用者,如果是COM的开发者可以随便的修改ID,我查过这个接口,我想你应该要使用这个接口,所以ID必须是这个数,否则创建COM不会成功。
楼主的COM库应该是指COM运行时期库(即一些DLL),而类厂是一个COM组件(使用COM的程序员编的),和将被应用的COM组件一起提供,装在一个DLL里。
之所以还要多提供一个类厂这样的机制,因为COM对象不一定非得分配在堆上,也可以分配在栈上。编的好一点的COM组件会根据自己的使用频率而使用不同的内存使用方式。因此类厂只是让COM组件可以自己处理创建的位置,增加内存使用的灵活性。
GUID是系统头文件中预定义了的,是一个struct,上面那样写只是为了方便,也可以通过数据成员赋值的形式。