关于类厂的疑问
书上讲,类厂本身也是一个COM对象,COM库通过类厂创建COM对象;每一个COM对象类应该有一个相应的类厂对象。
我的疑问是:“类厂” 和 “类厂对象” 是不是同一个东西?若不是,它们有什么不同?
---------------------------------------------------------------
类厂是一个概念,是类似一种类型,类厂对象是该类型的一个实例化的东西
---------------------------------------------------------------
下面讲的就非常好
IClassFactory的作用是创建COM组件。我们已经知道COM组件实际上就是一个类,那我们平常是怎么实例化一个类对象的?是用‘new’命令!很简单吧,COM组件也一样如此。但是谁来new它呢?不可能是客户程序,因为客户程序不可能知道组件的类名字,如果客户知道组件的类名字那组件的可重用性就要打个大大的折扣了,事实上客户程序只不过知道一个代表着组件的128位的数字串而已,这个等会再介绍。所以客户无法自己创建组件,而且考虑一下,如果组件是在远程的机器上,你还能new出一个对象吗?所以创建组件的责任交给了一个单独的对象,这个对象就是类厂。
每个组件都必须有一个与之相关的类厂,这个类厂知道怎么样创建组件,当客户请求一个组件对象的实例时,实际上这个请求交给了类厂,由类厂创建组件实例,然后把实例指针交给客户程序。这个过程在跨进程及远程创建组件时特别有用,因为这时就不是一个简单的new操作就可以的了,它必须要经过调度,而这些复杂的操作都交给类厂对象去做了。
IClassFactory最重要的一个函数就是CreateInstance,顾名思议就是创建组件实例,一般情况下我们不会直接调用它,API函数都为我们封装好它了,只有某些特殊情况下才会由我们自己来调用它,这也是VC编写COM组件的好处,使我们有了更多的控制机会,而VB给我们这样的机会则是太少太少了。
---------------------------------------------------------------
有什么好迷惑不解的
“类厂”就是一个com对象的定义, “类厂”就是类厂的一个实例
一个com对象对应一个类厂,com对象由类厂对象创建
类厂对象一般在DllGetClassObject中被创建
例如
extern "C" HRESULT __stdcall DllGetClassObject(const CLSID& clsid, const IID& iid, void **ppv)
{
if ( clsid == CLSID_Dictionary ) {
CDictionaryFactory *pFactory = new CDictionaryFactory;
if (pFactory == NULL) {
return E_OUTOFMEMORY ;
}
HRESULT result = pFactory->QueryInterface(iid, ppv);
return result;
} else {
return CLASS_E_CLASSNOTAVAILABLE;
}
}
---------------------------------------------------------------
呵呵,楼主后面的问题可以参考
http://expert.csdn.net/Expert/TopicView1.asp?id=2458893
由于楼主使用MFC,类厂的实例是在CWinApp派生类的InitInstance中的
COleObjectFactory::RegisterAll
中实现的。
---------------------------------------------------------------
请看MSDN中有一段话
类对象
这个类对象是一个特殊的 COM 对象,它的主要目的是实现 IClassFactory 接口。(您将经常听到这个对象被引用为“类厂”,甚至“类厂对象”,但是更准确地应该引用为类对象。)
所以说,“类厂” 和 “类厂对象” 实际上都叫做 “类对象”
书上讲,类厂本身也是一个COM对象,COM库通过类厂创建COM对象;每一个COM对象类应该有一个相应的类厂对象。
我的疑问是:“类厂” 和 “类厂对象” 是不是同一个东西?若不是,它们有什么不同?
---------------------------------------------------------------
类厂是一个概念,是类似一种类型,类厂对象是该类型的一个实例化的东西
---------------------------------------------------------------
下面讲的就非常好
IClassFactory的作用是创建COM组件。我们已经知道COM组件实际上就是一个类,那我们平常是怎么实例化一个类对象的?是用‘new’命令!很简单吧,COM组件也一样如此。但是谁来new它呢?不可能是客户程序,因为客户程序不可能知道组件的类名字,如果客户知道组件的类名字那组件的可重用性就要打个大大的折扣了,事实上客户程序只不过知道一个代表着组件的128位的数字串而已,这个等会再介绍。所以客户无法自己创建组件,而且考虑一下,如果组件是在远程的机器上,你还能new出一个对象吗?所以创建组件的责任交给了一个单独的对象,这个对象就是类厂。
每个组件都必须有一个与之相关的类厂,这个类厂知道怎么样创建组件,当客户请求一个组件对象的实例时,实际上这个请求交给了类厂,由类厂创建组件实例,然后把实例指针交给客户程序。这个过程在跨进程及远程创建组件时特别有用,因为这时就不是一个简单的new操作就可以的了,它必须要经过调度,而这些复杂的操作都交给类厂对象去做了。
IClassFactory最重要的一个函数就是CreateInstance,顾名思议就是创建组件实例,一般情况下我们不会直接调用它,API函数都为我们封装好它了,只有某些特殊情况下才会由我们自己来调用它,这也是VC编写COM组件的好处,使我们有了更多的控制机会,而VB给我们这样的机会则是太少太少了。
---------------------------------------------------------------
有什么好迷惑不解的
“类厂”就是一个com对象的定义, “类厂”就是类厂的一个实例
一个com对象对应一个类厂,com对象由类厂对象创建
类厂对象一般在DllGetClassObject中被创建
例如
extern "C" HRESULT __stdcall DllGetClassObject(const CLSID& clsid, const IID& iid, void **ppv)
{
if ( clsid == CLSID_Dictionary ) {
CDictionaryFactory *pFactory = new CDictionaryFactory;
if (pFactory == NULL) {
return E_OUTOFMEMORY ;
}
HRESULT result = pFactory->QueryInterface(iid, ppv);
return result;
} else {
return CLASS_E_CLASSNOTAVAILABLE;
}
}
---------------------------------------------------------------
呵呵,楼主后面的问题可以参考
http://expert.csdn.net/Expert/TopicView1.asp?id=2458893
由于楼主使用MFC,类厂的实例是在CWinApp派生类的InitInstance中的
COleObjectFactory::RegisterAll
中实现的。
---------------------------------------------------------------
请看MSDN中有一段话
类对象
这个类对象是一个特殊的 COM 对象,它的主要目的是实现 IClassFactory 接口。(您将经常听到这个对象被引用为“类厂”,甚至“类厂对象”,但是更准确地应该引用为类对象。)
所以说,“类厂” 和 “类厂对象” 实际上都叫做 “类对象”