use smart pointer
only automation object implements IDispatch.(Not all COM can be called by Invoke)

解决方案 »

  1.   

    在C++里面能不用Invoke最好不用。
    不知道你是怎样调用的,能详细点吗?
      

  2.   

    又是两位!多谢,
    没办法,我要写一个控件集成一个扫描控件。我通过oleview得到他的idl文件,编译出头文件后看了看有IDispatch接口,可没有其他方法的声明(我有说明书)。我只好在我的控件中来IDispatch::Invoke他了,我查询他的ID都能成功,但我用这个id去调用时就会出错!!错误代码:0x8000ffff。用errlook看了一下居然是:灾难性错误!!命苦啊! 
      

  3.   

    调用代码如下:(m_pFtScn2是一个内部组件)
    VARIANTARG vaRet;
    VariantInit(&vaRet);
    DISPPARAMS dispparms;
    memset(&dispparms,0,sizeof(dispparms));
    dispparms.cArgs=1;
    VARIANTARG *pArg=new VARIANTARG;
    dispparms.rgvarg=pArg;
    dispparms.rgvarg[0].vt=VT_I4;
    dispparms.rgvarg[0].lVal=(long)m_hWnd;
    HRESULT hr=m_pFtScn2->Invoke(dispid,
      IID_NULL,
      LOCALE_SYSTEM_DEFAULT,
      DISPATCH_METHOD,
      &dispparms,
      &vaRet,
      NULL,
      NULL);
    delete pArg;
    return hr;
    但是每次都返回0x8000FFFF灾难性故障 什么鸟意思啊!!
      

  4.   

    先用VariantInit把参数初始化看看吧,这是个好习惯。
    不过,我认为最大可能是说明书有误,跟开发商联系一下吧。
      

  5.   

    可是我在mfc中插入这个控件的话,就没问题可以用!我试着用COleDispatchDriver来调用还是不行,mfc里面是怎么实现的???
      

  6.   

    ActiveX Control 不能從普通的父窗口中 Invoke 出來, 而需要包含在 Control Container 中,建議你在 MSDN 中查一下 "ActiveX Control and Control Container Guidelines" 或者相關內容, 最好還是用 MFC,用 Win32 SDK 來寫很累的.
      

  7.   

    我自己写了一个测试程序,仿照kenwhale(屠夫)的参数,然后发现它的代码完全可以正确调用,不用象SuperChen(兔子)说的那样需要包含在Control Container中,可以用Invoke调用,但是我的接口不是纯dispatch接口,是双接口(抱歉,我不知道怎么实现纯dispath接口)。
    kenwhale(屠夫)这段代码我都原封不动使用的,他这里唯一就是dispid来历不明(不会是太大意把dispid弄错了吧,哈哈!)。
      

  8.   

    SuperChen(兔子):我也想用mfc啊,可要在atl里面写。
    阿行:我都想是dispid搞错了,那多好啊,天空多美丽!可我看了n遍而且用了n*n种方法表明id没错。
    const IID LIBID_FtScn2Lib = {0x1ECEC605,0x2DB6,0x11D3,0xA1,0xA0,0x00,0x00,0x0E,0xA5,0x55,0xD5}};
    const IID DIID__DFtScn2 = {0x1ECEC606,0x2DB6,0x11D3,0xA1,0xA0,0x00,0x00,0x0E,0xA5,0x55,0xD5}};
    const IID DIID__DFtScn2Events = {0x1ECEC607,0x2DB6,0x11D3,0xA1,0xA0,0x00,0x00,0x0E,0xA5,0x55,0xD5}};
    const CLSID CLSID_FtScn2 = {0x1ECEC608,0x2DB6,0x11D3,0xA1,0xA0,0x00,0x00,0x0E,0xA5,0x55,0xD5}};你说这里他把接口都表示为DIID是不是说这个是纯dispatch接口/?
      

  9.   

    看了看好像真的是纯DISPATCH接口,我该怎么办?
      

  10.   

    不是这个,dispid 是1,2,3,4...,idl文件里面[id(1), helpstring...声明的这个序号。
    我试过了在ATL生成的组件里面去掉了双接口的入口,结果仅仅凭IDispatch,一样可以invoke它的方法。
      

  11.   

    可以用IDispatch::GetIDsOfNames得到dispid。
      

  12.   

    arxing(阿行) :我试着用过GetIDsOfNames得到dispid可以成功得到,也与idl文件里面的吻合,哎,可是用这个id去invoke就会出错,可我不把他作为包容的内部控件仅仅用mfc写一个客户端来用这控件又不会有问题,真让人迷茫!!!
      

  13.   

    这也太奇怪了,这样吧,你跟踪mfc,一直找到调用IDispatch::Invoke的地方,看看它的参数是否跟你的一模一样。