CoCreateInstance也可以用于创建多个实例,那么还要CoGetClassObject做什么
CoCreateInstance也可以用来创建多个实例,那么还要CoGetClassObject做什么?
我知道CoCreateInstance是对CoGetClassObject的包装,在CoCreateInstance的内部是先创建了com组件的类厂,通过类厂的CoGetClassObject返回组件指针,然后类厂Release。
然后网上说要创建多个Com实例的话要用CoGetClassObject而不是CoCreateInstance.
我试了一下两次调用CoCreateInstance创建对象,得到的指针是不一样的,看起来没有什么问题啊。例如我自己用ATL写了一个简单对象叫做Fun,里面的接口叫做IFun。那么我自己的客户端程序可以创建两个实例:
运行也没有问题。我在CFun的构造/析构函数里面加入了打印,那么程序运行的输出如下:
看起来没有问题啊。那什么时候才需要调用CoGetClassObject()函数呢?
------解决方案--------------------
如果你知道com的本质,它不仅要能被c++调用,还要被vbs,js,C#等别的环境调用,所以一个组件的创建,和执行必须准守一个约定好的方式。
所以就有了ifactory接口,cogetclassobject只是获得这个接口,也叫类厂,别的语言通过这个类厂才能创建出组件。所以你用c++调用的话,会感觉多次一举。
------解决方案--------------------
当CoCreateInstance完成之后,组件实际上已经建立好了。在建立好一个组件之后,想要控制将组件装载到内存中何处或检查客户是否有来创建该组件基本上已经不可能了。所以就有了类厂,可以更灵活的操作。具体可以参考COM技术内幕第七章。
------解决方案--------------------
创建远程对象的时候,如果你不想创建位置通过注册表确定,而是通过代码指定创建对象的IP或电脑名的时候,就需要使用CoGetClassObject
我知道CoCreateInstance是对CoGetClassObject的包装,在CoCreateInstance的内部是先创建了com组件的类厂,通过类厂的CoGetClassObject返回组件指针,然后类厂Release。
然后网上说要创建多个Com实例的话要用CoGetClassObject而不是CoCreateInstance.
我试了一下两次调用CoCreateInstance创建对象,得到的指针是不一样的,看起来没有什么问题啊。例如我自己用ATL写了一个简单对象叫做Fun,里面的接口叫做IFun。那么我自己的客户端程序可以创建两个实例:
int _tmain(int argc, _TCHAR* argv[])
{
CoInitialize(NULL);
IFun* p1,*p2;
HRESULT hr=::CoCreateInstance(__uuidof(Fun),NULL,CLSCTX_ALL,__uuidof(IFun),(void**)&p1);
hr=::CoCreateInstance(__uuidof(Fun),NULL,CLSCTX_ALL,__uuidof(IFun),(void**)&p2);
p2->Release();
p1->Release();
CoUninitialize();
return 0;
}
运行也没有问题。我在CFun的构造/析构函数里面加入了打印,那么程序运行的输出如下:
CFun::CFun
CFun::CFun
CFun::~CFun
CFun::~CFun
Press any key to continue . . .
看起来没有问题啊。那什么时候才需要调用CoGetClassObject()函数呢?
------解决方案--------------------
如果你知道com的本质,它不仅要能被c++调用,还要被vbs,js,C#等别的环境调用,所以一个组件的创建,和执行必须准守一个约定好的方式。
所以就有了ifactory接口,cogetclassobject只是获得这个接口,也叫类厂,别的语言通过这个类厂才能创建出组件。所以你用c++调用的话,会感觉多次一举。
------解决方案--------------------
当CoCreateInstance完成之后,组件实际上已经建立好了。在建立好一个组件之后,想要控制将组件装载到内存中何处或检查客户是否有来创建该组件基本上已经不可能了。所以就有了类厂,可以更灵活的操作。具体可以参考COM技术内幕第七章。
------解决方案--------------------
创建远程对象的时候,如果你不想创建位置通过注册表确定,而是通过代码指定创建对象的IP或电脑名的时候,就需要使用CoGetClassObject