描述:
我目前需要调用一个Inventor的进程,使用
CLSID AppClsid;
hr = ::CoInitialize (NULL);
hr = ::CLSIDFromProgID (L"Inventor.Application", &AppClsid);
hr = CoCreateInstance (AppClsid,NULL,CLSCTX_LOCAL_SERVER, __uuidof(IUnknown), (void **) &pAppUnk);
hr = pAppUnk->QueryInterface (__uuidof(Application), (void **) &oApp);
这段程序已经可以实现,但是实现的方式是vc启动了一个新的Inventor进程。而我所期望的是能够先启动Inventor这个程序,然后由vc调用这个启动好的程序进程。
目前在vb里已经能够实现,代码如下:
Dim oApp As Inventor.Application
OnError Resume Next
Set oApp=GetObjrct(,"Inventor.Application")
请问这段程序用VC如何实现,谢谢。
解决方案1:
使用CoGetClassObject方法,而不是CoCreateInstance();
解决方案2: 问题:Inventor进程是如何被先启动的?COM服务器进程往往都是被动启动的,除非设置成服务或者自启动的程序。
进程外组件有两种形式:一种是单实例,即无论多少个客户端调用组件,都使用同一个服务器进程;另一种是多实例,即每个客户端进程调用组件时,都单独启动一个服务器进程,最典型的例子就是office、MSDN都属于多实例的例子。在多实例的情况下,CoGetClassObject调用是没有用的,必须使用CoCreateInstance。先了解一下Inventor是哪种类型吧。
VB use GetObject
VC use GetActiveObject
您可能想查找下面的文章:
- CoCreateInstance和CoCreateInstanceEx的区别??
- 抓狂!看了几天了,CoCreateInstance总是出错!!!!救命啊!
- 请教CoCreateInstanceEx产生E_ACCESSDENIED的原因
- CoCreateInstance的内部实现问题??
- 在DEV-CPP中编译建立快捷方式代码出现incompatibletypeforargument1of`CoCreateInstance'
- 用dll的COM除了cocreateinstance能不能就当普通DLL用loadlibrary调用。
- CoCreateInstanceEx问题
- CoCreateInstance调用成功,CoGetClassObject调用失败,为什么?
- CoCreateInstance调用出错,帮看看!
- CoCreateInstance的问题