最近作项目,人家提供ACTIVEX,并且有VB DEMO 
我们想用vc 来调用,结果不行VB DEMO 使用时,他们的一个EXE 必须运行着,然后使用
Set bt = GetObject("bactalk.activex.interface")
这样的语句就可以获得对象我在我vc 中使用如下
if( FAILED(::CLSIDFromProgID(L"bactalk.activex.interface", &clsid)))

TRACE("CLSIDFromProgID error"); // from Registry


if(::GetActiveObject(clsid, NULL, &pUnk) == S_OK)

{

VERIFY(pUnk->QueryInterface(IID_IDispatch, (void**)&pDisp) == S_OK);

vTxtAuto.AttachDispatch(pDisp);

pUnk->Release( );

TRACE(" attach complete \n");

}
结果调用失败,并且在注册表中找不到"bactalk.activex.interface",这样的信息,但是我不明白为什么VB可以使用.今晚再不能解决只能使用VB了希望各位帮忙~由衷感谢~~~

解决方案 »

  1.   

    if( FAILED(::CLSIDFromProgID(L"bactalk.activex.interface", &clsid)))

    TRACE("CLSIDFromProgID error"); // from Registry 这一步就失败了,无法得到CLSID
      

  2.   

    并且说下,关于CLSID"bactalk.activex.interface"
    是用过 加入他们的.tlb 得到相应的.h 和 .cpp 的
      

  3.   

    控件没有注册吗?
    直接在注册表中找,看找得到 bactalk.activex.interface 吗?
      

  4.   

    vb调用com的机制是一样的,也要通过注册表。你用vc调用时,那个exe也一样运行么,那个exe的作用之一可能就是注册,有好多activex把自注册部分取消了,在vc registered activex 中都找不到
      

  5.   

    #import "XXX.ocx"
    然后找到XXX.tlh文件,里面会有CLSID
      

  6.   

    是TLB的东东,我用工具OLEVIEW找到了CLSID,但是用了,但是还是if(::GetActiveObject(clsid, NULL, &pUnk) == S_OK)
    失败
      

  7.   

    // Generated .IDL file (by the OLE/COM Object Viewer)
    // 
    // typelib filename: <could not determine filename>[
      uuid(33FA6585-B81F-11D1-8257-00C0F009E3D7),
      version(1.0)
    ]
    library BACtalk
    {
        // TLib :     // TLib : OLE Automation : {00020430-0000-0000-C000-000000000046}
        importlib("stdole2.tlb");    // Forward declare all types defined in this typelib
        dispinterface IBACtalkActiveXInterface;    [
          uuid(0D7E4BA1-B820-11D1-8257-00C0F009E3D7)
        ]
        dispinterface IBACtalkActiveXInterface {
            properties:
            methods:
                [id(0x00000001)]
                VARIANT_BOOL AReadProperty(
                                long devinst, 
                                short objecttype, 
                                long objectinst, 
                                long propertyid, 
                                VARIANT_BOOL indexflag, 
                                long index, 
                                VARIANT* returndata, 
                                short* returnerrtype, 
                                short* returnerrclass, 
                                short* returnerrcode);
                [id(0x00000002)]
                VARIANT_BOOL AReadPropertyEx(
                                long devinst, 
                                short objecttype, 
                                long objectinst, 
                                long propertyid, 
                                VARIANT_BOOL indexflag, 
                                long index, 
                                VARIANT* returndata, 
                                long* updatecount, 
                                short* returnerrtype, 
                                short* returnerrclass, 
                                short* returnerrcode);
                [id(0x00000003)]
                void AWriteProperty(
                                long devinst, 
                                short objecttype, 
                                long objectinst, 
                                long propertyid, 
                                VARIANT_BOOL indexflag, 
                                long index, 
                                VARIANT data, 
                                short cmdprio);
                [id(0x00000004)]
                void ReadProperty(
                                long devinst, 
                                short objecttype, 
                                long objectinst, 
                                long propertyid, 
                                VARIANT_BOOL indexflag, 
                                long index, 
                                VARIANT* returndata, 
                                short* returnerrtype, 
                                short* returnerrclass, 
                                short* returnerrcode);
                [id(0x00000005)]
                void WriteProperty(
                                long devinst, 
                                short objecttype, 
                                long objectinst, 
                                long propertyid, 
                                VARIANT_BOOL indexflag, 
                                long index, 
                                VARIANT data, 
                                short cmdprio, 
                                short* returnerrtype, 
                                short* returnerrclass, 
                                short* returnerrcode);
                [id(0x00000006)]
                void SendTimeSync();
                [id(0x00000007)]
                void FileReadStream(
                                long devinst, 
                                long fileinst, 
                                long position, 
                                long numbytes, 
                                VARIANT data, 
                                long* numread, 
                                short* errtype, 
                                short* errclass, 
                                short* errcode);
                [id(0x00000008)]
                void FileWriteStream(
                                long devinst, 
                                long fileinst, 
                                long position, 
                                long numbytes, 
                                VARIANT data, 
                                short* errtype, 
                                short* errclass, 
                                short* errcode);
                [id(0x00000009)]
                VARIANT_BOOL TestSecurityLevel(short level);
                [id(0x0000000a)]
                void SendTimeSyncEx(
                                long useutctime, 
                                long uselocaltime);
        };    [
          uuid(0D7E4BA3-B820-11D1-8257-00C0F009E3D7)
        ]
        coclass BACtalkActiveXInterface {
            [default] dispinterface IBACtalkActiveXInterface;
        };
    };
    oleview 中显示的,应该是0D7E4BA1-B820-11D1-8257-00C0F009E3D7
    这个吧
      

  8.   

    import下看看吧,这个是最常用的方法了.
      

  9.   

    #import "C:\Program Files\Alerton\BACtalk\SYSTEM\bactalk.tlb"
    我也试过了,所以超级郁闷,为什么VB可以呢,vb连库都不用加,萨都不要,就可以用了~娘的~~
      

  10.   

    LZ 既然说他们的.exe必须先运行,我估计是他们的COM组件并没有注册,所以你在Registry里面找不到。很有可能是他们的.exe执行后,把组件直接注册到ROT(Running object table)里面去了。先用VC 自带的ROT Viewer先看看他们怎么回事儿。你直接用CLSID返回什么错误?不行用 ::CoGetObject(L"bactalk.activex.interface", 0,IID_IDispatch, &xxx) 直接试试。
      

  11.   

    ::CoGetObject 中的&xxx 用什么啊,能具体说下马,
    好像有点眉目
    在ROT(Running object table)中有信息
      

  12.   

    如果不行的话,拿到那个xxx.ocx或xxx.dll,拷贝至系统目录,
    然后在cmd里执行:
    cd\
    cd windows\system32
    regsvr32 xxx.ocx 或 regsvr32 xxx.dll
    然后试你自己的方法应该就会成功了.
      

  13.   

    解决了,超级感谢 feimingbiao() 
    也感谢其他仁兄建议。
    结分
      

  14.   

    谢谢楼主,从来没有见过这么多的钱。 :)能共享一下你是最后如何解决的吗? 我当时手懒,我的xxx是你的(void**)&pDisp,你可能已经搞清楚了。