【问题标题】:Easy IPC on Windows Mobile?Windows Mobile 上的简易 IPC?
【发布时间】:2010-09-17 01:05:55
【问题描述】:

在 Windows Mobile 上的 C++ 项目(即没有 .NET)中,我正在寻找一种在两个独立运行的应用程序之间轻松通信的方法。应用程序 A 将运行一项服务,而应用程序 B 将为用户提供一些功能——为此,B 必须调用 A 的一些功能。我宁愿不在 COM 中实现任何东西。

事实上,我宁愿不进行任何类型的序列化或类似操作(即这将排除使用套接字/管道/文件),而是让 B 将所有参数和指针传递给 A,就像 A 是一部分一样的 B。此外,应用程序 C、D 和 E 应该能够在只运行一个 A 实例的情况下执行相同的操作。

我应该补充一点,B 有时应该向 A 返回一个数组(或 std::vector 或 std::map),其中大小以前不知道。

这在 Windows Mobile 和其他平台上是否可行?

【问题讨论】:

    标签: windows-mobile ipc


    【解决方案1】:

    您不能只跨进程共享数据。我不推荐COM。 Windows CE 中不存在管道。您最好的路线是memory mapped file(就像在桌面上一样)或point to point message queue(在桌面上一点也不像)。哪个更好取决于您的使用场景。

    不要按照建议尝试将跨进程内存与 VirtualAlloc 一起使用,因为它是一种不安全的 hack 不安全且不受 CE 6.0 或更高版本的支持,因此您最终会在 WinMo 7 及更高版本下崩溃.

    我不建议使用 Windows 消息和 WM_COPYDATA。它速度慢、笨拙且极易出错。

    各位,请不要在没有使用平台的时候回答问题,只是为了获得声望积分。如果您不了解该平台,请让其他人帮助该人,而不是让他大吃一惊。

    【讨论】:

    • 谢谢,在阅读了更多内容之后,我想我只需要坚持使用本地套接字(这应该适用于所有移动平台)
    • pinvoking消息队列方法是否也最适合.Net CF?我们只是想用 Sqlite 库来做那些笨拙的旧 Sql 表。
    • 对于点对点队列,是的,P/Invoke 是唯一的选择。他们已经在这里完成了:msdn.microsoft.com/en-us/library/aa446556.aspx
    【解决方案2】:

    既然您只需要应用程序 (B) 与服务 (A) 进行通信,为什么不直接将 CreateFileDeviceIoControl 与一组已定义的 IOCTL 一起使用?

    【讨论】:

      【解决方案3】:

      这是一个很好的起点 - http://msdn.microsoft.com/en-us/library/aa446520.aspx 您决定哪个选项最适合您的需求。

      【讨论】:

        【解决方案4】:

        您已经涵盖了几乎所有可用的基础; COM、管道、套接字、内存映射文件。 Windows 中的所有进程都有完全独立的内存空间,因此如果不使用其中一种 IPC 机制,您将无法共享任何内容。

        【讨论】:

          【解决方案5】:

          在 Windows Mobile 上,我似乎记得所有进程都映射到同一个地址空间。因此,在两个进程中创建具有已知名称和/或类名的消息窗口,并在每个进程中使用 FindWindow 来查找另一个。

          然后,SendMessage 带有一个 WM_APP 定义的消息 id 和一个指向要在 wParam 或 lParam 中传输的数据的指针。

          如果我错了,Mobile 确实对进程内存进行了分区,那么只需使用 WM_COPYDATA - 在桌面上使用内存映射,因此速度非常快 - 在应用程序之间发送数据。

          【讨论】:

            猜你喜欢
            • 2012-06-14
            • 2010-11-18
            • 1970-01-01
            • 2011-10-30
            • 2015-05-31
            • 1970-01-01
            • 2010-10-05
            • 1970-01-01
            • 2011-04-26
            相关资源
            最近更新 更多