问题标签 [iconnectionpoint]

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 投票
5 回答
8065 浏览

c# - 连接到 C# 中的 COM 事件 - 支持托管和非托管服务器

我正在编写需要连接到 COM 事件的 C# 代码。我因此实现了 IConnectionPointContainer 和 IConnectionPoint 的使用:

问题是,当 COM 服务器实际上是在 .Net(例如 C#)中实现时,在 .Net 创建它之后,它会将其作为 .Net 对象而不是 COM 对象来处理。由于 .Net 对象没有实现 IConnectionPointContainer 接口,因此在尝试将对象强制转换为该接口时,我得到了 null。

知道如何解决这个问题吗?我当然可以在 C# COM 服务器中自己实现 IConnectionPointContainer,但是我想要一个更简单的解决方案,我可以轻松地向其他需要实现 COM 服务器的开发人员解释。

PS 我必须使用 IConnectionPointContainer,因为 COM 服务器可能在非 .Net(C++、Java)中实现。

谢谢, 因巴尔

0 投票
2 回答
907 浏览

delphi - 我如何在 Delphi 中做连接点?

我正在编写一个 DLL,它通过其 IDispatch 接口与 Excel 对话。从 VBA 中,我传入一个 Variant 包含Application.Caller我从中绘制 IDispatch 指针通过.pDispVal.

我想知道的是如何通过 IDispatch 指针查询接口。我想设置一个连接点容器,并从那里找到一个到 Excel 的连接点。最终目标是将事物与 Excel 的计算事件联系起来,并能够操作 Excel 数据。

0 投票
2 回答
389 浏览

delphi - 自动化对象泄漏内存 (TConnectionPoints)

我有一个带有事件支持的自动化对象,它会泄漏内存。生成源附带的 FConnectionPoints 永远不会被释放。当我在析构函数中手动添加 FConnectionPoints.Free 时,泄漏就消失了。

我在 Delphi 7 上,使用 FastMM BorlandMM.dll 和 FastMM_Fulldebugmode.dll。

重现步骤:

  1. 启动一个新的 ActiveX 库项目
  2. 添加一个新的自动化对象:Name = TestObject; 检查“生成事件支持代码”
  3. 打开TypeLibrary,给ITestObject添加一个方法,给ITestObjectEvents添加一个事件
  4. 刷新,将生成代码。
  5. 将 ShareMem 添加为 .dpr 文件中的第一个单元
  6. 保存、编译和注册这个 ActiveX Server(运行菜单)
  7. 启动一个新的应用程序项目
  8. 将 ShareMem 作为 .dpr 文件中的第一个单元
  9. 导入类型库单元:从您刚刚在步骤 6 中创建的 dll 创建单元,并选中“生成组件包装器”
  10. 在您的 FormCreate 添加以下代码:

代码:

现在编译、运行并关闭这个应用程序。将报告内存泄漏。

问题:

这是 Delphi 代码模板中的错误,是我做错了什么,还是打算自己释放 FConnectionPoints(帮助没有提及)?

0 投票
1 回答
312 浏览

c# - 从 .NET 附加到 COM 服务器中的事件时出现 E_ACCESSDENIED 异常

我有一个实现 IConnectionPoint 事件的 C++/ATL COM 服务器。我的客户端是一个附加到事件的 C# 应用程序。当 COM 服务器创建为 SYSTEM 服务时,客户端可以正确附加到事件。当 COM 服务器被创建为 LocalService 服务(首选)时,当我附加到事件时会收到 E_ACCESSDENIED 异常。

当 COM 服务器是 LocalService 时,我该怎么做才能使事件正常工作?

谢谢。

0 投票
2 回答
3633 浏览

c++ - 什么是 IconnectionPoint 和 EventHandling

试图了解它是什么IConnectionPoint以及它是如何连接到IConnectionPointContainer,IEnumConnectionPoints,IEnumConnectionsEventHandling

阅读MSDNCodeProject的文章,这些文章解释了其他方法,例如:QueryInterface()和其他东西。

我无法弄清楚所有这些东西(IConnectionPointContainer,IEnumConnectionPoints,IEnumConnections)是如何相互关联的以及事件处理。

我只想创建一个 simpleClient 来触发 COM 对象中的事件。

如果有任何文章或代码片段可以用简单而小块的代码来解释事物之间的关系,将会很有帮助。

值得一提的是,我最近开始用 C 开发,一个初学者。

编辑@sharptooth

换行“ typically your client will receive events and the COM object will trigger those events.

从许多文章中,我的理解是当我们在那时使用连接点时, the client exposes a set of methods that the server uses.

我只是概述了来自TechRepublich 的文章的一部分:

客户端服务器与接收源

因此,在标准客户端-服务器系统中使用 COM 进行正常编程与使用连接点之间的主要区别在于,在标准客户端-服务器情况下,服务器公开客户端使用的方法列表,而在连接点情况下,客户端公开了一组服务器使用的方法。

0 投票
1 回答
1117 浏览

c# - 为 COM 事件设置处理程序时出现 InvalidCastException

我有一个非托管 C++ COM 服务器,它设置为触发事件,我正在尝试从我的 C# 应用程序处理这些事件。

但是,设置处理程序时出现 InvalidCastException

堆栈跟踪显示:

指定的演员表无效。在 System.Runtime.InteropServices.ComTypes.IConnectionPoint.Advise(Object pUnkSink, Int32& dwCookie) 在 MyCOMSource_EventProvider.add_MyCOMEvent(MyCOMSource_MyCOMEventHandler) 在 MyCOMSource_Event.add_MyCOMEvent(MyCOMSource_MyCOMEventHandler)

我试过像这样设置自己的 IConnectionPoint

哪里myEventNotifier是这样定义的类对象:

connectionPoint.Advise但是我在堆栈跟踪中得到了相同的 InvalidCastException

指定的演员表无效。在 System.Runtime.InteropServices.ComTypes.IConnectionPoint.Advise(对象 pUnkSink、Int32 和 pdwCookie)

我假设这是客户端的一个问题,因为当我尝试做我自己的 ConnnectionPoint 事情以及让框架为我做这件事时,行为一致。但如果它是服务器端的东西:

在 COM 服务器端,我已经这样声明了

我的课堂上也有CONNECTION_MAPandCONNECTION_PART宏。

可能发生了什么,我该如何调试?

0 投票
2 回答
9362 浏览

c# - 将 WPF 按钮设置为在 IConnectionPoint 事件处理程序中可见

我对 C# 和 WPF 编程还很陌生,现在这个问题让我很头疼。

程序应该做什么:程序显示一个带有文本框的欢迎屏幕,客户可以在其中输入他的名字。如果设备靠近无线 LAN 接入点并成功连接,则此主窗口上的“开始”按钮应可见。

什么不起作用:在事件处理程序中设置按钮可见性。未应用新样式。此外,如果我在设置可见性属性/属性(?)之后尝试调用任何其他代码,它将不会运行(如果我在设置 visib 之前放置了 MessageBox.Show。如果我在设置后放置它,它将显示该属性,甚至不会再访问此代码)。

编码:

这是按钮元素:

这是 MainWindow.xaml.cs 中的事件处理程序注册

最后,事件处理程序:

就是这样——我希望你能帮助我。

非常感谢您的努力!

0 投票
1 回答
361 浏览

c# - 如何使用 IConnectPoint Unadvise 从接收通知中正确取消注册?

Mobile Broadband API 的文档中,它说:

以下过程描述了如何注册通知。

1.通过在IMbnInterfaceManager >对象上调用QueryInterface来获取IConnectionPointContainer接口。
2.在返回的接口上调用FindConnectionPoint,将IID_IMbnPinEvents传递给riid。
3. 在返回的连接点上调用 Advise,并将一个指向实现 IMbnPinEvents 的 > 对象上的 IUnknown 接口的指针传递给 pUnk。

可以通过在步骤 2 中返回的连接点上调用 Unadvise 来终止通知。

我有一些执行前 3 个步骤的代码,它成功注册了 MBN 事件。但是,现在我需要暂时取消注册以接收这些事件。
因此,在以 COM 异常结束的几次第一次尝试之后,我尝试了以下代码(使用 try/catch 块):

当我运行此代码时,我没有收到 MBN 的错误或异常。但是事件处理程序没有被取消注册。我仍然可以在日志文件中看到 MBN 事件到达并被处理。

谁能告诉我我错过了什么?谢谢你。

0 投票
0 回答
248 浏览

c# - FindConnectionPoint 方法返回空连接点

在使用接口进行 COM 互操作事件处理时,我发现这个POST几乎类似于我的代码。 如果您有任何与此主题相关的信息,请建议我。IConnectionPoints

我知道如果源接口(EventInterface)的 COnnectionPoint 有错误,它会FindConnectionPoint返回。NULL

我通过 QueryInterface 方法检查了支持源接口的 COM 对象(PS::HRESULT 返回 S_OK)。

这里发生了什么类型的错误?
请参考帖子。我也有同样的问题。 更新: 我的 tlh 文件快照>>

我的 cpp 文件快照>>

0 投票
1 回答
167 浏览

c# - 使用 COM Callable Wrapper 处理 firebreath PluginAPI.cpp 中的 c# 触发事件

Firebreath中的 JSCallBack对这件事有帮助吗?因为我刚刚看到它只处理 firebreath(native c++) 项目中发生的事件。我在这里吗?我使用 IConnectionPoint 接口的概念与包含事件签名的传出接口建立连接。我的代码与这篇文章非常相似。

我还发现了有关 COM 与客户端连接的信息。现在在这里有一个问题:我的 PluginAPI 类是否需要在 PluginAPI.h 文件中实现这个 Outgoing 接口?像这样,

如果是这样,那么它会引发 2 个错误

  1. 告诉不能实例化抽象类。将我指向 make_shared.hpp 的这些行

    模板< class T, class A1, class A2 > boost::shared_ptr< T > make_shared( A1 && a1, A2 && a2 ) { boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ));

    /li>

2.到alignment_of.hpp

在这里停留了最后 2 天。还有任何解决方法。