问题标签 [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.

0 投票
1 回答
276 浏览

winapi - 如何使用 ATL 创建匿名 IDispatch 函数?

有没有一种简单的方法可以创建一个从 IDispatch 派生的类,并且可以像这样传递给 API(这是 C++ ):

我知道如何创建一个 C++ 对象来处理具有值为 0 的 dispid 的调用,但是手动实现所有 IDispatch 总是有点痛苦。我想知道 ATL 是否有一些标准的方法,因为它相当普遍。

0 投票
1 回答
327 浏览

c++ - 如何获得原型成员函数(C++ -> Javascript)

有谁知道如何从 C++ 调用 Javascript 中的原型方法?

我有一个指向脚本 IDispatch 的指针,我可以获取原型的 IDsOfNames,但我找不到如何获取它的成员函数的 IDispatch。

说(伪代码):

我可以得到 foo 的有效 DISPID,但我不知道如何调用bar(baz). 有人有想法吗?

0 投票
1 回答
345 浏览

.net - 需要复制带有 .NET 支持的 IDispatch*;不知道班级名称

我正在使用以下方法在我的 C++ 程序中托管一个 .NET 库,但不是一个详尽的列表:

我有对应于 .NET 类的 C++ 类。每个类实例都包含一个CComPtr<IDispatch>,我用它来调用函数和获取/设置成员变量。

这很好,除了当我复制我的 C++ 类时,我最终得到两个 C++ 类实例,它们都指向同一个 .NET 实例。当我在一个实例中更改变量值时,它会反映在另一个实例中。

所以,我真的很想复制我的 IDispatch 指针,这样每个 C++ 类实例都有一个唯一的 .NET 类实例。我可以打电话CreateInstance(),但由于各种原因,找出库和类名很不方便。

tl;dr
如何在不查找类/库名称的情况下复制我的 .NET 支持的 IDispatch 指针?

谢谢!

0 投票
0 回答
380 浏览

com - 对 Excel.Application 使用 IDispatch.GetTypeInfo() 的 Visual Studio IDE 崩溃

我正在编写一个与 COM 组件交互的应用程序,在 Visual Studio 10 IDE 中运行我的应用程序时使用 Excel.Application 组件时遇到了问题。我遇到了致命的内存不足错误。如果我只运行 EXE,一切都运行良好,但这严重限制了我的调试能力。我以这种方式访问​​的所有其他 COM 组件都可以正常工作,包括本地组件和商业组件。

这是一个演示此崩溃的控制台应用程序。为简单起见,我删除了所有错误处理。在有问题的代码周围放置一个 try/catch 块并没有帮助。此项目需要对 CustomMarshalers.dll 的引用。

我认为问题仅仅是由于 Excel 的大小。

0 投票
2 回答
1788 浏览

winapi - CreateStdDispatch 如何知道调用什么方法?

我面临着实现一个IDispatch接口。有四种方法,幸运的是其中三种很简单:

这是最后一种方法,Invoke很难。在这里,我不得不实际处理DispID,并调用我的适当方法;从变体数组中解组参数。

不想编写所有繁琐的样板代码,我肯定会有错误,我去谷歌搜索 - 而不是做任何工作。

在 MSDN 文档中IDispatch.Invoke找到了这个片段:

通常,您不应该直接实现Invoke

出色的!反正我也不想实施!继续阅读:

相反,使用调度接口创建函数CreateStdDispatchDispInvoke。有关详细信息,请参阅CreateStdDispatchDispInvoke创建 IDispatch 接口公开 ActiveX 对象

创建 IDispatch 接口链接说:

您可以通过以下任何方式实现 IDispatch:

  • [剪辑]
  • 调用CreateStdDispatch函数。这种方法是最简单的,但它不提供丰富的错误处理或多种国家语言。
  • [剪辑]

太好了,CreateStdDispatch它是:

通过单个函数调用创建 IDispatch 接口的标准实现。这简化了通过自动化暴露对象的过程。

我打算称它为:

我无法弄清楚的是 Windows API 实现如何CreateStdDispatch知道在我的对象上调用什么方法 - 特别是因为CreateStdDispatch不知道我正在使用什么面向对象的语言或其调用约定。

怎么会CreateStdDispatch知道

  • 给定的调用什么方法dispid
  • 我的语言的调用约定?
  • 如何处理我的面向对象对象所用语言的异常?

注意:我别无选择,只能实施dispinterface;我没有定义接口。我希望这是一个简单的早期绑定IUnknown,但事实并非如此。

0 投票
2 回答
1503 浏览

javascript - 在 IE9 上使用 DISPID_NEWENUM 使用 C++ 检索 javascript 数组对象失败

在我前段时间回答的一个类似问题之后,我发现在尝试枚举对象时,在 IE9 上使用IDispatch::Invoke(DISPID_NEWENUM,...)失败。 这发生在任何 javascript 数组上的and上。DISP_E_EXCEPTION
IDispatchIDispatchEx

不用说,代码在 IE6-IE8 上运行良好,仅在 IE9 上失败。

到目前为止,同样的问题也出现在MSDN 开发论坛中,但没有成功。

这是一个代码片段来演示我尝试做的事情。请注意,这pDispatch是 javascript 的数组变体。

有谁知道为什么这段代码总是失败(IDispatch 和 IDispatchEx),HRESULT 为 DISP_E_EXCEPTION,特别是在 IE9 上?

谢谢。

0 投票
1 回答
1191 浏览

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。如果可以的话,请分叉和改进:)

0 投票
1 回答
665 浏览

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 中获取函数地址。

我究竟做错了什么?

非常感谢。迈克尔。

0 投票
1 回答
381 浏览

windows - 在释放的 COM 对象上调用调用

我创建了一个 COM 对象,用于某些应用程序的自动化任务。发生这种情况时,应用程序将启动并显示其主窗口。

当用户关闭主应用程序窗口时会出现问题。对 COM 对象的 Next Invoke 调用不起作用。问题是它不会失败,也不会报告错误。如果我在下一行代码中放置调试器断点,则永远无法到达。如果我用 try/catch 包围 Invoke 调用,则不会捕获到异常。在发布版本中它只是崩溃。

这应该如何工作?由于我使用 CComDispatchDriver 作为 IDispatch* 的包装器,因此我希望即使用户关闭应用程序,我的 AddRef 也会使 COM 对象保持活动状态。我希望至少得到一些 HRESULT 作为错误。

0 投票
1 回答
1440 浏览

delphi - XE2 中的访问冲突强制转换 IDispatch

我们正在使用一些旧代码(由 Binh Ly 创建的 ComLib.pas),因此我们可以在 (OleVariant) 对象上使用枚举接口:

此代码适用于 Delphi 2010 和 2007,但不适用于 XE2。在上面标记的行(带有注释“RAISES EXCEPTION”),我们得到一个异常:

项目 x.exe 引发异常类 $C0000005,并带有消息“0xbaadf00d 处的访问冲突:读取地址 0xbaadf00d”。

传入的对象确实具有 TDispNewEnum 接口,因此不应引发异常(如 Delphi 2010 和 2007 的情况)。

建议?谢谢。