问题标签 [idispatch]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
winapi - 如何使用 ATL 创建匿名 IDispatch 函数?
有没有一种简单的方法可以创建一个从 IDispatch 派生的类,并且可以像这样传递给 API(这是 C++ ):
我知道如何创建一个 C++ 对象来处理具有值为 0 的 dispid 的调用,但是手动实现所有 IDispatch 总是有点痛苦。我想知道 ATL 是否有一些标准的方法,因为它相当普遍。
c++ - 如何获得原型成员函数(C++ -> Javascript)
有谁知道如何从 C++ 调用 Javascript 中的原型方法?
我有一个指向脚本 IDispatch 的指针,我可以获取原型的 IDsOfNames,但我找不到如何获取它的成员函数的 IDispatch。
说(伪代码):
我可以得到 foo 的有效 DISPID,但我不知道如何调用bar(baz)
. 有人有想法吗?
.net - 需要复制带有 .NET 支持的 IDispatch*;不知道班级名称
我正在使用以下方法在我的 C++ 程序中托管一个 .NET 库,但不是一个详尽的列表:
我有对应于 .NET 类的 C++ 类。每个类实例都包含一个CComPtr<IDispatch>
,我用它来调用函数和获取/设置成员变量。
这很好,除了当我复制我的 C++ 类时,我最终得到两个 C++ 类实例,它们都指向同一个 .NET 实例。当我在一个实例中更改变量值时,它会反映在另一个实例中。
所以,我真的很想复制我的 IDispatch 指针,这样每个 C++ 类实例都有一个唯一的 .NET 类实例。我可以打电话CreateInstance()
,但由于各种原因,找出库和类名很不方便。
tl;dr
如何在不查找类/库名称的情况下复制我的 .NET 支持的 IDispatch 指针?
谢谢!
com - 对 Excel.Application 使用 IDispatch.GetTypeInfo() 的 Visual Studio IDE 崩溃
我正在编写一个与 COM 组件交互的应用程序,在 Visual Studio 10 IDE 中运行我的应用程序时使用 Excel.Application 组件时遇到了问题。我遇到了致命的内存不足错误。如果我只运行 EXE,一切都运行良好,但这严重限制了我的调试能力。我以这种方式访问的所有其他 COM 组件都可以正常工作,包括本地组件和商业组件。
这是一个演示此崩溃的控制台应用程序。为简单起见,我删除了所有错误处理。在有问题的代码周围放置一个 try/catch 块并没有帮助。此项目需要对 CustomMarshalers.dll 的引用。
我认为问题仅仅是由于 Excel 的大小。
winapi - CreateStdDispatch 如何知道调用什么方法?
我面临着实现一个IDispatch
接口。有四种方法,幸运的是其中三种很简单:
这是最后一种方法,Invoke
很难。在这里,我不得不实际处理DispID,并调用我的适当方法;从变体数组中解组参数。
不想编写所有繁琐的样板代码,我肯定会有错误,我去谷歌搜索 - 而不是做任何工作。
我在 MSDN 文档中IDispatch.Invoke
找到了这个片段:
通常,您不应该直接实现Invoke。
出色的!反正我也不想实施!继续阅读:
相反,使用调度接口创建函数CreateStdDispatch和DispInvoke。有关详细信息,请参阅CreateStdDispatch、DispInvoke、创建 IDispatch 接口和公开 ActiveX 对象。
创建 IDispatch 接口链接说:
您可以通过以下任何方式实现 IDispatch:
- [剪辑]
- 调用CreateStdDispatch函数。这种方法是最简单的,但它不提供丰富的错误处理或多种国家语言。
- [剪辑]
太好了,CreateStdDispatch它是:
通过单个函数调用创建 IDispatch 接口的标准实现。这简化了通过自动化暴露对象的过程。
我打算称它为:
我无法弄清楚的是 Windows API 实现如何CreateStdDispatch
知道在我的对象上调用什么方法 - 特别是因为CreateStdDispatch
不知道我正在使用什么面向对象的语言或其调用约定。
怎么会CreateStdDispatch
知道
- 给定的调用什么方法
dispid
? - 我的语言的调用约定?
- 如何处理我的面向对象对象所用语言的异常?
注意:我别无选择,只能实施dispinterface
;我没有定义接口。我希望这是一个简单的早期绑定IUnknown
,但事实并非如此。
javascript - 在 IE9 上使用 DISPID_NEWENUM 使用 C++ 检索 javascript 数组对象失败
在我前段时间回答的一个类似问题之后,我发现在尝试枚举对象时,在 IE9 上使用IDispatch::Invoke(DISPID_NEWENUM,...)
失败。
这发生在任何 javascript 数组上的and上。DISP_E_EXCEPTION
IDispatch
IDispatchEx
不用说,代码在 IE6-IE8 上运行良好,仅在 IE9 上失败。
到目前为止,同样的问题也出现在MSDN 开发论坛中,但没有成功。
这是一个代码片段来演示我尝试做的事情。请注意,这pDispatch
是 javascript 的数组变体。
有谁知道为什么这段代码总是失败(IDispatch 和 IDispatchEx),HRESULT 为 DISP_E_EXCEPTION,特别是在 IE9 上?
谢谢。
c++ - 为什么没有释放对我的 IDispatch 对象的所有引用?
我在我的 C++ 程序中托管一个 IWebBrowser2 控件,只使用普通的 Win32(没有 mfc、atl、wtl 等)。在 DISPID_NAVIGATECOMPLETE2 上,我添加了一个自定义对象,可以从显示的网页上运行的 javascript 访问。
要添加自定义对象,我使用 DISPATCH_PROPERTYPUT 调用 InvokeEx 和带有指向自定义对象的指针的 DISPARAMS 结构。
在调用 InvokeEx 期间,我的自定义对象的 AddRef 函数被调用,并且我增加了它的引用计数器。但是对象永远不会调用它的 Release 函数,所以引用计数器永远不会再次减少到零。
在 InvokeEx 中调用 AddRef() 之后,谁负责调用 Release()?
编辑:(添加一些代码)
这是将我的自定义对象添加到 IHTMLWindow2 的代码。custObj
指向我的自定义对象
这是我要添加的对象(为简洁起见,省略了一些私人成员)
编辑2:
现在它似乎可以正常工作了,我决定把它放在 github 上。
https://github.com/Tobbe/CppIEEmbed。如果可以的话,请分叉和改进:)
c++ - C++ DispInvoke 找不到成员
场景是这样的:
- 我有一个 COM 对象来提问。将其命名为 ICom。
- COM 对象要求我实现一个 IDispatch,它是 IComEvents 的后代,它会通知我发生事件。
- 我实现了一个 IDispatch 并将其连接到 COM 接口。
到现在为止还挺好。我的 IComEvents 后裔的 Invoke() 在事件发生时被调用。
现在的重点是我必须手动解析 Invoke() 参数。比如一个通知函数是HRESULT OnMouseHit(int x),我要从DispID中检测到这个函数,然后手动调用,例如
对于我想要实现的所有功能,我都必须这样做。但是我看到了 DispInvoke() 函数,它可能会自动为我执行此操作,并使用正确的参数为 dispId 调用适当的重载方法:
如何生成 m_ptinfo?通过使用 COM 对象的 libid 调用 LoadRegTypeLib,然后使用 IComEvents 的 IID 调用 ITypeLib::GetTypeInfoOfGuid()。但是,DispInvoke() 总是返回“找不到成员”。
会有什么问题?我希望 DispInvoke 解析类型信息,从 DispID 中找到成员函数名,然后使用“this”指针从 vtbl 中获取函数地址。
我究竟做错了什么?
非常感谢。迈克尔。
windows - 在释放的 COM 对象上调用调用
我创建了一个 COM 对象,用于某些应用程序的自动化任务。发生这种情况时,应用程序将启动并显示其主窗口。
当用户关闭主应用程序窗口时会出现问题。对 COM 对象的 Next Invoke 调用不起作用。问题是它不会失败,也不会报告错误。如果我在下一行代码中放置调试器断点,则永远无法到达。如果我用 try/catch 包围 Invoke 调用,则不会捕获到异常。在发布版本中它只是崩溃。
这应该如何工作?由于我使用 CComDispatchDriver 作为 IDispatch* 的包装器,因此我希望即使用户关闭应用程序,我的 AddRef 也会使 COM 对象保持活动状态。我希望至少得到一些 HRESULT 作为错误。
delphi - XE2 中的访问冲突强制转换 IDispatch
我们正在使用一些旧代码(由 Binh Ly 创建的 ComLib.pas),因此我们可以在 (OleVariant) 对象上使用枚举接口:
此代码适用于 Delphi 2010 和 2007,但不适用于 XE2。在上面标记的行(带有注释“RAISES EXCEPTION”),我们得到一个异常:
项目 x.exe 引发异常类 $C0000005,并带有消息“0xbaadf00d 处的访问冲突:读取地址 0xbaadf00d”。
传入的对象确实具有 TDispNewEnum 接口,因此不应引发异常(如 Delphi 2010 和 2007 的情况)。
建议?谢谢。