问题标签 [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 回答
423 浏览

com - COM 是否支持多个双接口?

我制作了一个具有多个双接口的 COM 对象。它适用于早期版本的编译器,但不适用于当前版本。

我的问题:COM 规范是否说这应该有效(因此我应该报告编译器错误),还是不应该有效?此页面表明它可能并不适用。

RIDL 文件:

访问它的代码(这是伪代码,我在“真实”代码中有额外的语句来显示HRESULTs):

所以,问题在于它的ibar行为与intf. ibar本来可以foo_method叫它的,但好像不知道是什么东西bar_method

我期待第二个GetIDsOfNames电话给0,然后 Invoke 能够打电话bar_method,第三个 GetIDsOfNames 应该给0x80020006

关于编译器的额外信息(虽然,需要明确的是,我的问题是 COM 规范是否说它应该工作):在 BDS 2006 中有效,在 C++Builder XE5 中无效。我浏览了实现 COM 的 XE5 中的代码,并且 ojbect 工厂在第一次创建对象时填充了一个ITypeInfo *using ,但随后的实现对所有结果都使用相同的,它不再使用 new调用。那是在.GetTypeInfoOfGUID(CLSID_....)QueryInterfaceITypeInfoGetTypeInfoOfGUIDIIDITypeInfoDispGetIDsOfNamesIDispatch::GetIDsOfNames

0 投票
0 回答
572 浏览

c++ - c++ MFC SDI DLL调用OLE Server使用IDispatch的方法

我已经编写了一个 c++ MFC DLL,它提供了一个 SDI 应用程序,它是一个非常旧的 OLE 服务器。(我没有选择使用这个 OLE 服务器,所以我必须让它工作。)

我正在从 C# 访问这个 c++ DLL。

我有一切“工作”。我可以调用 DLL 的方法,我已经正确实现了 C# 委托,等等。

我可以直接在 C++ 中调用 OLE 服务器的方法并导出这些方法,以便我的 C# 应用程序调用也调用它们。这是我的“Hello World”,用于从 C# 访问 OLE 服务器的全部功能。

到目前为止,一切都很好。

下一步是使这个 C++ DLL 尽可能多地成为“传递”,以便 C# 开发人员可以围绕这个 OLE 服务器编写业务逻辑。如果 OLE 服务器的制造商发生更改或更新,我们不想更新 C++ 代码,我们希望响应 C# 中的更改。

因此,即使我可以使用从 OLEServer.tlb 文件中导入的类在 C++ 中实现方法并将这些方法传递给 C#,我们最终也不希望这样做。我试图通过 IDispatch 接口调用方法,但我遇到了我不太理解的困难。

我将 Visual Studio 2010 用于非托管 C++ 和 C#。

上面的以下行给了我一个“错误的变量类型”错误:

顺便说一句,我确信代码可以大大改进,自从我用 C++ 编写以来已经有好几年了,这只是让它工作的“第一步”,所以没有真正的错误处理等。

我玩弄了“Args []”类型和值,其中包含“类型不匹配”错误和“空引用指针”的变体

.tlb 文件导入的函数如下所示:

哦,虽然我将“pMethodNameAndParamsInReverseOrder”作为参数传递,但我只是对其进行硬编码以使这个简单的方法起作用。一旦我使用了这个和其他一些方法,我计划让这个通用来处理 COM 接口通过 IDispatch 实现的任何方法。

任何帮助将不胜感激,主要是为了让这个工作,但我也很感激任何关于改进代码的指针,我有很多东西要在 C++ 中学习

谢谢你!

顺便说一句,如果这有助于澄清事情,那么 App.pTriadView->pTriadItem->Catalog 是我正在实现的 COM 类

编辑:

感谢@HansPassant(见第一条评论)我明白了我错过了什么。不幸的是,我遇到了修复该问题的下游结果。VARIANT“pResult”返回为空。我现在将继续追捕,但欢迎任何想法:)

0 投票
0 回答
370 浏览

vba - ATL 创建的 COM 接口继承了 IDispatch 但后期绑定不起作用

这是我的 IDL 文件。IFrame 是双接口,同时继承了 IDispatch 和 IUnknown。

这是假设实现 IFrame 的 CFrame 类声明:

COM 服务器已注册,当我在 VBA 中使用 Frame 对象但通过早期绑定时它工作正常。我想将此对象与 VBScript 一起使用,所以我确实需要后期绑定。

但是不能进行后期绑定。我了解了情况,似乎 ATL(和 IDispatchImp 类)完成了 IDispatch 所需的所有实现,这使我能够使用自动化工具(例如 VBScript)来使用对象。

但是,在实践中,脚本会给出“无法创建 Active X 控件”错误。当我尝试早期绑定时,在 VBA 中也是如此。

我究竟做错了什么?我在 Windows 7 64 位上使用 Visual Studio 2012,但我的 COM 服务器是 32 位的(并且已在系统中注册)。

0 投票
1 回答
3004 浏览

c++ - 如何使用所需的 BSTR* 参数正确调用 IDispatch::Invoke

有许多关于如何使用 BSTR* 参数调用 IDispatch::Invoke 的示例。我有这个与许多其他“SomeType *”参数一起使用,但无论我尝试什么,我都会得到类型不匹配的 HRESULT、E_OUTOFMEMORY 或访问冲突。在我看来,我在记忆方面做错了,但我正在遵循我发现的不同示例......作为旁注,最终的“[out] UINT puArgErr”参数永远不会填充导致参数索引问题。但是,我知道这是 BSTR 类型的第三个参数(我已经成功调用了另一个方法,它采用了前面的两个参数。)

*

*

*

我不明白为什么当我关注 BTR* 参数的其他示例时会发生这种情况……此外,我还有许多其他成功调用 IDispatch::Invoke 的方法,但是这个 BTR* 让我停了下来。

绝望,请帮助!

添加:

IDL 为:[id(0x00000171)] short GetCategory(short nIndx, short* nCat, BSTR* bszName);

0 投票
0 回答
448 浏览

c++ - DLL 线程回调工作正常,但在回调调用 InvokeHelper 时会导致访问冲突

我创建了一个 DLL,它启动一个轮询 USB 设备的线程,当 DLL 从 USB 设备获取消息时,它调用回调函数。

在代码中使用此 dll 包括从 DLL 创建类的实例,然后调用所述类的方法来设置回调函数,然后启动线程,以便每次 USB 设备执行某些操作时都会发生回调,线程有效,回调发生(它是一个键盘设备,所以它只是以 LPCSTR 的形式发送按键)但是当我将此按键值传递给内部函数时,它会导致访问冲突。与其他任何使用相同值调用此函数的方法一样,工作正常。

这是导致访问冲突的行

包含功能:

DLL 设置回调:

DLL 启动线程:

DLL 消息线程:

0 投票
0 回答
1756 浏览

c# - “COM 目标未实现 IDispatch”异常

我是 COM 编程的新手,解决方案可能很简单,但我做不到。我的 COM 客户端代码在早期绑定中运行良好。后期绑定问题。

客户端代码:使用 .net 4.0 框架

实际obj.InvokeMember 抛出“COM 目标不实现IDispatch”异常。

IDL 文件:

请建议我的代码出了什么问题?

谢谢,帕万

0 投票
1 回答
539 浏览

c# - Com 接口类型为 IDispatch 时的默认属性

在 ac# com 接口中,可以像这样定义一个默认成员

使用 IDispatch(或双重)一切都按预期工作,从 VBA 我可以省略这样的属性

但是如果我只将接口定义为 IUnknown,它就不起作用。在 excel 对象浏览器中,我仍然看到标有“蓝点”并标记为“默认成员”的属性。但是 .Item 必须在 VBA 代码中明确指定。

有没有办法让 IUnknown 中的默认属性表现得像 IDispatch 中一样?

0 投票
1 回答
407 浏览

winapi - 检索传出调度接口成员的 DISPID

我坚持这个。

给定三个变量:

  • 一个IDispatch*可连接的对象
  • IID对象上的传出调度接口的 (DIID)
  • 分配接口定义的成员的名称

如何将名称解析为 DISPID?

  • pDispatch->GetIDsOfNames(...)Returns DISP_E_UNKNOWNNAME,正如我所料(传出接口不是由可连接对象实现的)
  • 我需要支持 0 个客户端尚未连接到传出接口的场景,因此我无法枚举现有连接点以调用GetIDsOfNames其中一个(我什至不确定这是否可行)
  • 为了执行手动反射,我需要 dispinterface 的ITypeInfo. 我可以从 coclass 的ITypeInfo. 但是pDispatch->GetTypeInfo(0, ...)返回ITypeInfo实现IDispatch(根据文档),而不是ITypeInfococlass。ITypeInfo(并且这个对象的实现没有暴露其他s IDispatch。)
0 投票
2 回答
556 浏览

java - 如何为 BSTR* 调用 OleAutomation 对象方法?

这是我从类型库中获得的 IDispatch 接口:

这是我的java代码:

输出是:

可执行文件打开,但它没有做我想要的,你可以看到它失败了,我认为它与nameand rgdispidNamedArgs.

这是一个有效的 Perl 等价物:

我第一次在 Java 中使用 OleAutomation 并且没有太多经验,也可以在互联网上找到很少的示例,我尝试转换我为我的项目找到的示例,但示例是BSTR而不是BSTR*,在我看来,这是唯一的区别,它不起作用,我不知道为什么。CallSet 方法用于各种设置/调用,例如 20-30,但我对"Call_setCallDistance"特别感兴趣。如果你能伸出援手,我会很高兴!

0 投票
0 回答
1262 浏览

c++ - 如何创建 COM IDispatch 指针并将其作为回调从 C++ 控制台客户端成功传递到 C++ WinService?

提前对太长的帖子表示抱歉,但考虑到涉及的部分很多,我不确定我会在哪里犯错,因此,我需要发布所有涉及的部分。请不要假设任何事情,我可能会在这里犯任何类型的错误。

问题:

1)真正的问题:刚刚学习COM。

2) 我需要将 IDispatch 指针从 C++ 中的控制台客户端 ( ConsoleClient ) 作为参数传递给 Windows 服务 ( WinService ) 中的 COM 函数。此 IDispatch 指针充当回调。WinService 知道要调用的函数的名称。我所有的尝试都没有成功。我收到不同的错误,例如:未实现、RPC 不可用等。

注意:以下错误是正确的!我在@Igor 指出我的错误后进行了编辑:在 STA 线程中有一个 do-while(我从 main() 中删除)。我在 main() 线程(而不是 do-while)中添加了一个消息泵(GetMessage、TranslateMessage 和 DispatchMessage),我的问题得到了解决!

我有一个 WinService 公开以下 COM 接口(WinService 的 idl 文件):

WinService 内部期望vCallBack .vt = VT_DISPATCH,即当我从 ConsoleClient.EXE 应用程序调用 WinServiceCOM 函数时需要传入的回调指针。WinService 知道充当回调的函数的名称。即,WinService 从IDispatch-pointer-callback GetIDsOfName 调用以“ FunctionCallback ”作为参数。但是,在这里我在 WinService 中遇到不同的错误,例如:未实现,RPC 不可用等。然后没有执行回调(ConsoleClient 没有收到任何返回)。

到目前为止我所做的(以下所有源代码都在 ConsoleClient.EXE 中找到)ConsoleClient.EXE main.cpp:

所有主要的都成功执行。但是,我从来没有从回调中得到任何东西。当 WinService 尝试从 IDispatch 指针回调中查询接口时,它会抛出以下错误:未实现,RPC 不可用,等等......

创建 ConsoleClient IDispatch 接口的模板类来自:http: //blogs.msdn.com/b/oldnewthing/archive/2013/06/12/10425215.aspx

disInterfaceBase.h:

ConsoleClient ConsoleClient.h 中的实际 IDispatch 实现

和 ConsoleClient.idl

我创造了:

我还使用 regtlibv12.exe 注册了 tlb

很抱歉这篇文章太长了,但是 COM 强迫我这样做,特别是我是 COM 的新手,我不知道我会在哪里犯错。

注意:我确信调用(从 ConsoleClient.EXE)到 WinService COM 函数(WinServiceCOMfunction)是成功的(我调试了它并在调用之后点击了这个函数)。

NOTE2:我确信使用回调的 WinService 有效。还有其他实现(在不同的编程语言中)通过 WinService 中的相同功能(WinServiceCOMfunction)使用此机制。

有什么帮助吗?提前致谢!