读书人

已困绕三天,全世界转了遍没找着解决方

发布时间: 2012-03-23 12:06:21 作者: rapoo

已困绕三天,全世界转了遍没找着解决方案.使用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

读书人网 >VC/MFC

热点推荐