【问题标题】:Unexpected IConnectionPointImpl::Unadvise call on Windows Embedded Compact 7Windows Embedded Compact 7 上的意外 IConnectionPointImpl::Unadvise 调用
【发布时间】:2020-10-04 14:03:27
【问题描述】:

我们有一个更大的软件在 Win CE6 上运行,没有问题。核心功能在提供连接点的 COM 服务器 DLL 中实现。 COM 客户端程序在程序启动时为连接点注册事件处理程序以获取状态通知等。在程序退出时,它通过调用相应的IConnectionPointImpl::Unadvise 方法取消注册处理程序。

现在,我们正在移植程序以在 Win EC 7 上运行。Win EC 7 的新板支持包 (BSP) 运行良好。还有具有不同选项的不同版本,在不同时间使用来自 Microsoft 的不同来源创建,但我们的软件总是显示相同的问题。

在程序启动时,启动后约 10 秒,IConnectionPointImpl::Unadvise 在所有已注册的事件处理程序上被意外调用。我们的源代码中只有一个方法调用IConnectionPointImpl::Unadvise,这绝对不会被执行。

问题出现 ~95%,但有时程序启动并运行时没有问题。由于程序的大小,我们不能使用调试器,性能很差。

我们猜测,COM 运行时调用IConnectionPointImpl::Unadvise 方法是出于某些原因。但我们不知道如何防止这种情况发生。

有没有人观察到同样的问题?是否有可用的解决方案/解决方法?谢谢。

【问题讨论】:

  • 我在 Win10 上遇到了几乎相同的问题...您找到解决方案了吗?
  • @David:作为一种解决方法,我们用普通回调替换了 COM 连接点,这在 CE 6、EC 7 和 2013 上运行良好。对于连接点问题本身,我们没有找到解决方案。
  • Arf,我做不到……所以我们将继续搜索。如果我们找到了解决方案,我会把它放在这里;)
  • 谢谢,祝你好运!
  • 我们终于找到了这个问题的根源。当我们在自定义 AppDomain 中使用这个类时,它来自对一个类的MarshalByReObject 的继承。我们仍在寻找解决方法。

标签: c++ com windows-ce iconnectionpoint


【解决方案1】:

所以我们终于找到了解决这个问题的方法。

我们移除了对MarshalByReObject 的依赖,并将其替换为ISerializable 的正确实现。

这允许我们在自定义 AppDomain 中正确加载,我们的程序集和事件不再松动。

但这对加载程序集和配置文件的路径有副作用。为了解决这个问题,我们还实现了一个AppDomain.AssemblyResolve 事件,它允许我们将加载重定向到适当的位置。

希望对你有帮助;)

【讨论】:

  • 感谢您的回复,我们会试一试。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-26
  • 2020-11-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多