5

在 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 和其他平台上是否可行?

4

5 回答 5

14

您不能只跨进程共享数据。我不推荐COM。Windows CE 中不存在管道。您最好的路线是内存映射文件(如桌面上)或点对点消息队列(与桌面上不同)。哪个更好取决于您的使用场景。

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

我不建议使用 Windows 消息和 WM_COPYDATA。它很慢,很笨拙,而且很容易出错。

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

于 2008-10-14T12:12:57.487 回答
0

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

于 2008-11-10T06:34:19.660 回答
0

这是开始的好来源 - http://msdn.microsoft.com/en-us/library/aa446520.aspx 您决定哪个选项最适合您的需求。

于 2008-12-17T22:34:22.573 回答
-1

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

于 2008-10-14T07:15:43.530 回答
-3

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

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

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

于 2008-10-14T07:16:45.277 回答