Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从脚本调用IDispatch时,DISPID_值是否可靠?_C++_Internet Explorer_Com_Activex - Fatal编程技术网

C++ 从脚本调用IDispatch时,DISPID_值是否可靠?

C++ 从脚本调用IDispatch时,DISPID_值是否可靠?,c++,internet-explorer,com,activex,C++,Internet Explorer,Com,Activex,继续往下讲,我不清楚脚本函数和属性(在我的例子中是JavaScript)的IDispatch::Invoke()上的DISPID_值是否可以被视为调用由IDispatch表示的实际函数的标准和可靠的方法 如果是,MSDN中是否有提及 请注意,问题在于是否可以预期这种行为,而不是一些我事先不知道的接口可能是什么样子 一个简单的用例是: // usage in JavaScript myObject.attachEvent("TestEvent", function() { alert("rhuba

继续往下讲,我不清楚脚本函数和属性(在我的例子中是JavaScript)的
IDispatch::Invoke()
上的
DISPID_值
是否可以被视为调用由
IDispatch
表示的实际函数的标准和可靠的方法 如果是,MSDN中是否有提及

请注意,问题在于是否可以预期这种行为,而不是一些我事先不知道的接口可能是什么样子

一个简单的用例是:

// 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);

编辑:试图澄清问题。

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

您可以将DISPID添加到DISPID接口,但发布后无法更改。如果需要,可以使用将名称映射到dispid


花几美元在亚马逊上买一本Inside Ole(第二版)和Inside Ole 2(第二版)。对于这些晦涩难懂的OLE咒语来说,它是一个很好的参考。

如果脚本一致地定义对象,那么对脚本中的对象进行调用应该是可靠的。MSHTML中的JScript/Javascript应该是这样,但不幸的是,关于这个主题的文档非常稀少,我手头没有任何可靠的证据

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


正如meklarian所说,DISPID_值(0)对JS函数的作用似乎非常一致(因此它在自定义附件中非常有效)。我已经用这种方法用了大约一年了,而且一直有效。我还发现,对于嵌入了
标记的activeX控件,为了使其一致工作,我需要为实现CComObject的主(对象标记)IDispatch实现IConnectionPointContainer和IConnectionPoint,但任何其他我公开给javascript作为方法或属性返回值的控件(通过调用)我必须自己实现attachEvent和detachEvent

使用连接点时,相关IDispatch对象将期望事件激发到IDispatch对象上附加到的同一DISPID


有关实现连接点的示例,请参见。

DISPID_值通常应该一致对我没有帮助-我可以期望它一致地调用所有表示脚本函数的
IDispatch
s上的实际函数吗?根据我的经验,是的,只要它们直接代表脚本对象。正如我在下面的回答中所提到的,您通过连接点获得的IDispatch对象有一点不同,
GetIDsOfNames()
在我想调用时获取我,例如,交给我的控件的匿名函数对象?它没有给您这一点。您需要从类型库或文档中找到类型信息