在wince6.0下,进程间通讯的选择问题,大家讨论下呢

时间:2021-03-23 17:47:29
现在要在wince6.0下做应用开发,有2个程序组成
1、Core,
   在Core程序中有一些全局的变量,准备开发Core_set和Core_get来得到这个变量的值;
   Core一直在运行,不退出。
2、App应用程序
   在App段可以调用Core_set和Core_get来设置和取得变量值;
现在遇到的问题是:Core_set调用的时候,需要在Core段来执行一段代码来触发对应的事件。


方案:
1、使用进程间通讯
   用createfilemapping来共享这些全局变量,但在Core端不能够实时得到变量
2、用DCOM来做
   测试了下,比较复杂,调试快吐血了,
3、在Core端建立一个SocketServer来做,
   在App端频繁的调用,会不会出现性能问题?

大家有没有比较好的思路,讨论下

非常感谢!

10 个解决方案

#1


使用共享变量是一个方法

或使用进程间消息机制,App发消息给Core来改变变量的值

#2


也可以考虑使用消息队列,
我们项目中多数都是用的这个。

#3


非常感谢楼上的2位:
现在考虑这个方案可以么:
1、在Core做成service,开辟一个足够的带name的内存映射对象,createfilemapping,
2、在app端可以可以打开内存映射对象,可以得到对应内存区域的值,如果要设置值的话,通过DeviceIoControl来操作对应的变量

不知道是否可行?

#4


该回复于2011-04-12 15:39:00被版主删除

#5


1.进程A调用CreateFileMapping创建一个内存映射文件。

      2.进程A调用MapViewOfFile获取到映射到文件的内存起始地址,调用memcpy往内存中拷贝数据。

      3.进程B调用CreateFileMapping打开进程A创建的内存映射文件。

      4.进程B调用MapViewOfFile获取到映射到文件的内存起始地址,调用memcpy从内存中读出数据。

      5.通信完后进程A,B分别调用UnmapViewOfFile,CloseHandle取消内存映射和关闭内存映射对象句柄。

#6


你可以使用MessageQueue来共享数据。

#7


谢谢楼上的兄弟们,这2天测试下这些方式行不行?
dcom方式基本排除了,tmd,真调试得吐血了,一直找不到方法,不知道什么原因,

#8


写了个测试的services,发现把dll和reg都写到nk.bin中,服务是可以起来的,但把该services的dll不打包在nk.bin中,copy到nandflash中,不能够启动。
如何用services.exe或者对应编程的方式来加载services?
用编程的方式调用RegisterService;
windows ce 6.0的msdn中提到 
The RegisterService function has been removed.
也不知道RegisterService 现在用什么来代替了?
晕了

#9


自己顶下,现在RegisterService 已经不支持了,也不知道用什么来加载,最好能够直接程序中控制

#10


我做的进程通讯是用消息来实现的,比较简单。
有两种方式,一种是采用WM_COPYDATA消息,这个是专门用来进行进程通讯的,可以发一个整块内存的指针过去,用SendMessage或者SendMessageTimeout的方式;

另一种是自己定义一个私有消息,比如两边都定义m_Msg = RegisterWindowMessage("SPCIAL MESSAGE");
然后以m_Msg为消息发送,不过这种只能发送包含wParam和lParam两个相当于是int型大小的信息过去。

具体怎么用就看自己灵活了

#1


使用共享变量是一个方法

或使用进程间消息机制,App发消息给Core来改变变量的值

#2


也可以考虑使用消息队列,
我们项目中多数都是用的这个。

#3


非常感谢楼上的2位:
现在考虑这个方案可以么:
1、在Core做成service,开辟一个足够的带name的内存映射对象,createfilemapping,
2、在app端可以可以打开内存映射对象,可以得到对应内存区域的值,如果要设置值的话,通过DeviceIoControl来操作对应的变量

不知道是否可行?

#4


该回复于2011-04-12 15:39:00被版主删除

#5


1.进程A调用CreateFileMapping创建一个内存映射文件。

      2.进程A调用MapViewOfFile获取到映射到文件的内存起始地址,调用memcpy往内存中拷贝数据。

      3.进程B调用CreateFileMapping打开进程A创建的内存映射文件。

      4.进程B调用MapViewOfFile获取到映射到文件的内存起始地址,调用memcpy从内存中读出数据。

      5.通信完后进程A,B分别调用UnmapViewOfFile,CloseHandle取消内存映射和关闭内存映射对象句柄。

#6


你可以使用MessageQueue来共享数据。

#7


谢谢楼上的兄弟们,这2天测试下这些方式行不行?
dcom方式基本排除了,tmd,真调试得吐血了,一直找不到方法,不知道什么原因,

#8


写了个测试的services,发现把dll和reg都写到nk.bin中,服务是可以起来的,但把该services的dll不打包在nk.bin中,copy到nandflash中,不能够启动。
如何用services.exe或者对应编程的方式来加载services?
用编程的方式调用RegisterService;
windows ce 6.0的msdn中提到 
The RegisterService function has been removed.
也不知道RegisterService 现在用什么来代替了?
晕了

#9


自己顶下,现在RegisterService 已经不支持了,也不知道用什么来加载,最好能够直接程序中控制

#10


我做的进程通讯是用消息来实现的,比较简单。
有两种方式,一种是采用WM_COPYDATA消息,这个是专门用来进行进程通讯的,可以发一个整块内存的指针过去,用SendMessage或者SendMessageTimeout的方式;

另一种是自己定义一个私有消息,比如两边都定义m_Msg = RegisterWindowMessage("SPCIAL MESSAGE");
然后以m_Msg为消息发送,不过这种只能发送包含wParam和lParam两个相当于是int型大小的信息过去。

具体怎么用就看自己灵活了