请问在VC中如何调用本地的ActiveX Exe(就象VB中的CreateObject后调用一样)?已知条件:
    VB生成的ActiveX Exe: ProgID="VBText.Text"
                         方法:function GetData(byref strIn as string) as string
采用方法:
?STDAPI CoCreateInstance(REFCLSID rclsid, LPUNKNOWN pUnkOuter, DWORD dwClsContext,
 REFIID riid, LPVOID *ppv); 
?HRESULT CoCreateInstanceEx(REFCLSID rclsid,IUnknown *punkOuter,DWORD dwClsCtx, COSERVERINFO *pServerInfo,
           ULONG cmq,MULTI_QI *pResults);问题:
1、如何创建ActiveX Exe对象?如果采用CoCreateInstance,riid通过何种方法获得(就象rclsid通过CLSIDFromProgID函数获得一样)?
2、如何调用对象中的GetData方法?最好有代码实例!

解决方案 »

  1.   

    1. 你可以通过oleview这个实用工具查一下该com的接口。或者在vc中直接使用import <application name>语句让编译器生成相应的tlh和tli文件。你在其中找一找,就会发现Interface和IID了。2. 这个如果你手动调用的话,就只能利用IDispatch方法了,非常麻烦,不过VC可以根据该组件自动生成一个包装类,再调用就会很简单了。直接写方法就行了
      

  2.   

    这样的话,如果ActiveX Exe版本升级的话,VC的程序也必须跟着重新编译,而此程序只是负责传入/传出数据的作用。我想找到这种方法,即ProID和GetData方法不发生变化时,即使ActiveX Exe升级了,VC程序也不必重新编译,就象VB中的CreateObjcet一样。
      

  3.   

    HRESULT CLSIDFromProgID(
      LPCOLESTR lpszProgID,  //Pointer to the ProgID
      LPCLSID pclsid         //Pointer to the CLSID
    )
      

  4.   

    1、如果添加了新的接口,而老接口没有变化,是不是也不需重新编译?
    2、CLSIDFromProgID 是获得rclsid,riid也是通过CLSIDFromProgID获得吗?
      

  5.   

    1. 不需要
    2. 可以用oleview或直接用regedit工具查查看。如果你知道interface的名字,也可以用IIDFromString函数得到
      

  6.   

    1. 不需要
    2. 可以用oleview或直接用regedit工具查查看。如果你知道interface的名字,也可以用IIDFromString函数得到
      

  7.   

    采用#import方式也出问题,这倒是我没有想到的!
    情况如下:
        编辑时能出现_TestPtr 和 _Test,但用它们中的任一个定义变量进行编译时,出现“undeclared identifier”的情况。
    大家帮帮我!
      

  8.   

    一般import会生成一个以typelib为名的namespace,你需要显示的指定这个名空间才行。比如:namespace是test的话,那么你就必须用test::_TestPtr和test::_Test才行。
    当然,你也可以在import后面加上no_namespace参数,这样编译器就不会生成namespace了,你可以直接引用_TestPtr和_Test了。
      

  9.   

    问题是加上no_namespace时#import在编译时就通不过,而不加时用test::_TestPtr在编译时通过了,但_TestPtr的变量中怎么也无法出现GetData方法,_Test的变量中倒是出现了,请问能告诉我应该怎么做吗?能否提供一个简单的示例代码?
      

  10.   

    用_Test的变量又出现了下列问题:
    cannot instantiate abstract class due to following members:
      

  11.   

    maphis(bool bPoor=true):
        您是不是作地图的?我也是作地图的,[email protected]本来想尽了各种办法也没试成功,最后打算用DelPhi作,安装完后重启机器时,发现硬盘有点问题,检测重启后,同样的程序,居然在VC下通过了(各种错误再也没有发生),莫名其妙!