首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

已困绕三天,全世界转了遍没找着解决方案.使用DispInvoke或者ITypeInfo:Invoke实现IDispatch:Inovke方法,总是返回E_NOT

2012-03-23 
已困绕三天,全世界转了遍没找着解决方案.使用DispInvoke或者ITypeInfo::Invoke实现IDispatch::Inovke方法,

已困绕三天,全世界转了遍没找着解决方案.使用DispInvoke或者ITypeInfo::Invoke实现IDispatch::Inovke方法,总是返回E_NOTIMPL
这个问题已困绕我三天,全世界转了个遍没找着解决方案,包括微软的自家的程序也有这个问题.


      我使用COM   API   从IDispatch派生实现了一个双接口的简单的自动化组件,如下所示:

        struct   IMath:public   IDispatch
        {
                virtual   HRESULT   __stdcall   Add(   UONG   a,UONG   b,UONG*   pret   )   =   0;
                virtual   HRESULT   __stdcall   Sub(   UONG   a,UONG   b,UONG*   pret   )   =   0;
        };

        但是在实现IDispatch接口的时候遇到如下几个疑难问题

1       使用DispInvoke或者ITypeInfo::Invoke实现IDispatch::Inovke方法,总是返回E_NOTIMPL,但是,同时使用DispGetIDsOfNames和ITypeInfo::GetIDsOfNames来实现IDispatch::GetIDsOfNames又完全没有问题.真是要崩溃了.

        对于这个问题,我在google和百度上搜了遍,好像遇到这个问题的人很少,只有一个老外给某个专家发了邮件声称遇到此问题,而那个专家又正好没有回复.

        微软MSDN里的演示程序   ashHelloWorld   也存在此问题,所以该作者也是手写代码实现的IDispatch::Invoke,即使用DispInvoke或ITypeInfo::Invoke来实现IDispatch::Invoke方法,则该方法始终返回E_NOTIMPL我看了看MFC的IDispatchImpl的源代码,也是使用的这种方法,不过我没有测试过是否可行.ATL的实现方法则是在内存中自已用代码动态创建一个vtbl.
       

2     若是自己写代码实现IDispatch::Invoke,大概代码如下:
     
      SomCls::Invoke(   DISPID   dispid...)
      {
          switch(   dispid   )
          {
              case   1:   return   Add()  
              case   2:   return   Sub()
              default:   return   DISP_E_BADINDEX;
            }
          return   DISP_E_BADINDEX;
      }
     
    写了一段C++代码用Invoke调用,没有任何问题.

    然后用一段JScript代码测试

var   om   =   new   ActiveXObject( "Math.Object ");

var   ri   =   om.Increase(2,1);//语句1
var   rd   =   om.Decrease(2,1);     //语句2
     
     
      语句1正常调用后,跟着就弹出一个JScript   运行时错误说是 "对象不支持该属性或方法 ",错在语句2那一行.然后如果把个语句调个顺序如下:

var   rd   =   om.Decrease(2,1);     //语句1
var   ri   =   om.Increase(2,1);//语句2

        语句1正常调用后,还是弹出一个JScript运行时错误提示 "om为空或不是对象 ".


        农药已经装备好了,真的搞不定这玩艺我的人生也没啥奔头了,哪位天使大姐救命啊.

     
     


[解决办法]
为什么不用ATL来实现?
[解决办法]
http://fruitfruit.blogspot.com/2004/11/use-idispatch-interface.html

热点排行