2009-11-05 40 views
5

继续从this question,我很困惑DISPID_VALUEIDispatch::Invoke()脚本函数和属性(在我的情况下,JavaScript)可以被认为是标准和可靠的调用由IDispatch代表的实际功能?
如果是的话,是否在MSDN中的任何地方提及?DISPID_VALUE对于从脚本调用IDispatch时可靠吗?

请注意,问题是关于是否可以预期这种行为,而不是事先看不到的某些接口。

一个简单的例子是:

// usage in JavaScript 
myObject.attachEvent("TestEvent", function() { alert("rhubarb"); }); 

// handler in ActiveX, MyObject::attachEvent(), C++ 
incomingDispatch->Invoke(DISPID_VALUE, IID_NULL, LOCALE_SYSTEM_DEFAULT, 
         DISPATCH_METHOD, par, res, ex, err); 

编辑:试图澄清问题。

回答

3

如果脚本定义一致,它应该可靠地调用脚本中的对象。对于MSHTML中的JScript/Javascript来说,这应该是这种情况,但不幸的是,关于这个主题的文档确实很少,我没有任何可靠的证据。

根据我自己的经验,传递给attachEvent()的Javascript函数应始终保持一致 - 接收到的“函数”对象只能有一个与自身匹配的可调用方法。因此,默认方法是唯一可以找到的,DISPID 0. Javascript函数通常不具有成员函数,尽管我确信有一种方法可以实现这一点。如果它具有成员函数,则会以与成员函数相同的方式查看它们。根据expando函数的规则,JScript中的成员函数始终与IDispatchEx一致,因为添加到对象的任何函数都被视为expandos。

IDispatchEx interface @ MSDN

2

DISPID_VALUE调用的默认方法或属性应该对给定接口一致。该方法/属性必须在类型库的IDL中的接口定义中指定为DISPID_VALUE。它可能改变的唯一方法是,如果接口的所有者发布了一个新版本的接口,它改变了默认的方法/属性,但这会违反COM接口的基本规则。

+0

DISPID_VALUE通常应该是一致的并不能帮助我 - 我是否可以期望它始终如一地调用代表脚本功能的所有'IDispatch'的实际功能? – 2009-11-05 17:56:36

+0

根据我的经验,是的,只要它们直接代表脚本对象即可。正如我在下面的回答中所提到的,通过ConnectionPoints获得的IDispatch对象有点不同 – taxilian 2009-12-25 06:15:41

0

您可以将DISPID添加到DISPINTERFACE中,但发布后无法更改它们。如果需要,可以使用IDispatch::GetIDsOfNames将名称映射到DISPID。

拿起一本Inside Ole(第二版)和Inside Ole 2(第二版),在亚马逊上使用几块钱。对于这些晦涩的OLE咒语来说,这是一个很好的参考。

+0

当我想打电话时,GetIDsOfNames()会给我带来什么?匿名函数对象交给我的控制? – 2009-11-05 18:00:34

+0

它不会给你。您需要从类型库或文档中找到类型信息 – 2009-11-10 04:11:28

1

正如meklarian说,DISPID_VALUE(0)似乎很consistantly为JS职能的工作(因此使用自定义的attachEvent的伟大工程)。我一直以这种方式使用它们大约一年,而且它一直都很有效。我还发现一个嵌入了<object>标签的activeX控件,为了使它始终如一地工作,我需要为主(对象标签)IDispatch实现CComObject实现IConnectionPointContainer和IConnectionPoint,但是我公开给javascript的任何其他人从方法或属性返回值(通过Invoke)我必须自己实现attachEvent和detachEvent。

当使用连接点,有问题的IDispatch的对象会想到,因为它们连接到您的IDispatch对象上的事件被解雇到同一DISPID ..

看到http://code.google.com/p/firebreath/source/browse/src/ActiveXPlugin/JSAPI_IDispatchEx.h为实现ConnectionPoints的例子。

相关问题