问题标签 [connection-points]
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.
c++ - 如何检查容器是否支持多个连接?
- 实现了接收器类 - 接收来自 COM 服务器的事件通知
- 事件接口派生自IDispatch
我有一个问题,即IConnectionPoint::Advise调用返回E_NOTIMPL。这可能是因为连接点只允许一个连接 - MSDN。
笔记:
- COM 服务器在进程外
- 纯 C++ 实现
编辑:
S8.tlh:Win32 类型库 S8.tlb 的 C++ 源代码等效项:
Class Sink的实现——处理事件通知:
编辑:
Sink类中IUnknown接口的实现
问题:
- 如何检查容器是否支持多个连接?
- 如果需要更多信息,请相应评论。
c++ - 未收到所述事件通知
问题:
未收到接收器(类)实现中列出的事件通知(来自 COM 对象 - 服务器)。
接收到一个事件通知( Event_one ),但未相应接收其他事件通知
如果更改顺序-在IDispatch::Invoke 中,即:
- if
Event_one
被交换到Event_two
thenEvent_two
收到通知,但Event_one
其他人相应地被忽略
- if
问题:
- 更好的实现方式,IDispatch::Invoke 还是 QI?
- 使用错误的逻辑或方法?
注意:
- 没有 MFC
- 无 ATL
- 纯 C++
- 使用消息循环:GetMessage()
- STA模型( Coinitialize() )
- 调用 IDispatch::Advise成功(来自调用S_OK的 HRESULT )
- 在上面之后,COM对象方法调用正常(带有接口指针)
- 单次致电 Advise
- MIDL 编译器生成的类型库
例如(示例):
IDispatch::Invoke的插图- 取自Sink 类:
查询接口说明:
c++ - 无法使 ATL 连接点正常工作
我正在尝试使用 ATL 创建一个 COM 组件,并且我想为我的 VB 客户端引发事件。我发现了许多教程,所有这些教程的细节似乎都各不相同,而且似乎都没有生成一个可行的解决方案。这是我正在做的事情:
(使用 Visual Studio 2008):
- 创建一个新的 ATL DLL 项目。我已经调用它了
ATLEventTest
。 - 类视图:右键单击
ATLEventTest
,添加了一个新的 ATL 简单对象类。我称之为这个MyObject
,它产生了CMyObject
,,IMyObject
等等...... 该对象是通过以下方式创建的:a) 单元线程 b) 聚合 c) 双接口 d) ISupportErrorInfo e) 连接点
右键单击
CProxy_IMyObjectEvents<T>
,单击“添加功能”- 函数的返回类型为 void,命名为
someEvent
,并采用int testParam
. - 重建。
(此时,我应该能够在某处看到“实施连接点”。我没有……) - 右键单击
CMyObject
。'添加连接点' - 将“
_IMyObjectEvents
”移到列表中。 - 在我的解决方案中进行了代码搜索。到处都找不到
someEvent
! - 再次添加该
someEvent
功能。现在,它位于 ATLEventTest_i.h - 应该可以调用
fire_someEvent(...)
我的代码,但不能。
这一直让我发疯,试图让它发挥作用。如果有人能看到我做错了什么,我将不胜感激任何更正、提示、黑客等。
在这一点上,我很想说把向导搞砸了,直接尝试修改 c++ 和 idl,但我有一种感觉可能不会更好:(
visual-c++ - 在 VC++ 6 中创建一个新的连接点?
我有一个 ATL/COM 项目,在 VC++ 6 中。我想要一个现有的类,它以前从未被定义为引发事件,引发事件。为此,该类必须实现一个“连接点”。
这些事件属于以前没有任何类引发过的类型,因此我将不得不创建一个新的连接点,而不是重用现有的连接点。
我知道如何让一个类实现一个连接点——右键单击类视图中的类,选择“实现连接点”,然后从它显示的列表中选择适当的连接点。
我知道如何创建一个新的连接点,只要它与一个新的 ATL 类相关联来实现它 - 在创建类时检查“支持连接点”。
但是我不知道如何在不创建实现它的新 ATL 类的情况下创建新连接点。
我修改了 IDL 以包含类似于现有连接点定义的内容:
(显然我有一个真正的 uuid,而不是“ blah blah blah ”)。
完成此操作后,_IBlahEvents 界面将显示在类视图中。但是当我右键单击要实现 _IBlahEvents 的 ATL 类并选择“实现连接点”时,_IBlahEvents 不会显示在现有连接点列表中。
我已经重新编译,包括清理和重建所有内容。
我错过了什么?
谢谢。
internet-explorer - 对象标签上的 IE attachEvent 导致内存损坏
我在具有以下事件的嵌入式 IE7/8 HTML 页面中有一个 ActiveX 控件[id(1)] HRESULT MessageReceived([in] BSTR id, [in] BSTR json)
。在 Windows 上,该事件是使用 注册的OCX.attachEvent("MessageReceived", onMessageReceivedFunc)
。
以下代码在 HTML 页面中触发事件。
在我使用应用程序验证程序启用 gflags.exe 后,出现以下奇怪的行为:在执行 JavaScript 回调的 Invoke() 之后,来自 pvars[1] 的 BSTR 出于某种未知原因被复制到 pvars[0] !pvars 的 delete[] 导致双重释放相同的字符串,然后以堆损坏结束。
有人知道这里发生了什么吗?这是一个 IE 错误还是在 OCX 实现中我缺少一个技巧?
如果我使用如下标签:
...奇怪的复制操作不会发生。
由于 Fire_MessageReceived() 的调用者负责释放 BSTR,因此以下代码似乎也可以。
谢谢!
c++ - 重新生成连接点方法
我创建了一个连接点接口_IPlayerEvents。
我添加了几个方法
我已经构建了项目,VS2008 已经在 CProxy_IPlayerEvents 类中生成了代码:
现在我向 _IPlayerEvents 接口添加了另一个方法
当我构建时,没有代码被添加到 OnMessage 函数的 CProxy_IPlayerEvents 类中——我预计 VS2008 会生成:
如果可以的话,我宁愿避免手动更新 CProxy_IPlayerEvents。
如何强制 VS2008 重新生成 CProxy_IPlayerEvents 类?
c++ - 为什么 IE 不监听 ActiveX 事件?
我使用 longrun 方法将 ActiveX 控件放到 HTML 页面上,该方法应该触发要由 IE 处理的事件。
它们不会触发m_vec.GetSize() == 0
,因为这意味着 IE 没有连接到我的 ActiveX。
站点是 localhost,它位于受信任的站点中,并且安全级别设置为最低。
html
IDL
С++ 继承列表:
COM_MAP
CONNECTION_POINT_MAP
CATEGORY_MAP
这里有什么问题?为什么 IE 无法连接到我的连接点界面?
临时解决方案
我放弃了游戏<script for event>
并开始将javascript回调函数作为方法参数(类型IDispatch*
)传递
c# - 如何从未知的 com 对象接口(例如连接点)获取 guid?
我有正在运行的服务,可通过 COM 获得。我可以使用Activator
.
我连接 COM 库
然后通过 Instance 获取我的对象
这实际上是IConnectionPointContainer
有几个连接点,并且有一个
如果我在 cpp atl 中没记错的话__uuid(IHelloWorld)
问题是:如何在容器中获取一些“IHelloWorld”接口(连接点)的指南?
c++ - Microsoft Word 连接点接收器示例/MFC 出现问题
我一直在尝试使用 MFC 为第三方 COM 组件实现连接点接收器。我之前开发过一些 COM 组件,虽然连接点接收器不是我精通的东西。在我的头撞墙一段时间后,我决定回到基础并找到这个 Microsoft 示例:
https://support.microsoft.com/en-us/kb/183599
这似乎与我正在尝试做的最相似。我试图完全按照描述重现该示例。虽然我的 MS Word 版本是 2010,但引用的界面似乎仍然有效。我尽职尽责地按照说明进行操作,将代码剪切并粘贴到我自己的项目中,只需要对宽字符串进行调整。编译后,我可以启动 word app 并退出它,但我没有收到连接点事件,这毕竟是重点。我认为问题可能出在函数 dispid 上,所以我尝试将 DISP_FUNCTION_ID 条目添加到调度图中;但这只会导致 oledisp1.ccp 第 549 行上的断言,该断言位于 CCmdTarget::GetStackSize 函数中。
我敢肯定这很简单,但我就是无法让它工作。有人可以帮我弄清楚示例中缺少什么吗?谢谢。
c++ - 调用 FindConnectionPoint 时访问冲突写入内存
我正在尝试订阅 MBN 活动。这是我的代码:
由于文档(恕我直言)有点缺乏,我将自己定位于我在网上找到的一些代码示例。直到我称FindConnectionPoint
一切正常。调用时,FindConnectionPoint
我收到写入内存的访问冲突,所以我想问题出在我的IConnectionPoint
指针上,它在我发现的多个代码示例中声明。
希望有更多监督的人能够帮助解决这个问题。提前致谢