大侠请进:CE下两个应用程序怎么通信?

eadou   2009-3-9 18:14 楼主
请问在CE平台上怎么完成两个应用程序的数据通信呢?

应用背景:
应用程序A(C#代码)在运行时会开启应用程序B(C++代码),即程序B覆盖在A之上。
之后会时不时的向B发送视频数据,B收到数据后做解码并显示出来。
问题是A如何向B发送数据呢?

已经做的尝试:
1、B不是以独立的程序出现,而是封装成dll,然后由A调用,这样就不存在不相关进程之间传递数据的问题了。
但是因为B所要实现的解码功能调用了N多.h文件和.lib文件,而A程序是基于C#的,不能之间使用.h和.lib,必须都要封装成dll,可是我没弄清楚把.h和.lib封装成dll,故放弃了这种方法...

2、采用WM_COPYDATA在两个应用程序间传递数据。
此方法中发送调用了SendMessage函数,接收重载了WndProc。
但是在CE下C++中不支持SendMessage中的某个参数形式,而C#下又无法重载WndProc,得用WndProcHooker,这有涉及到了挂钩技术...我看了半天也是一头雾水

故强烈请求大侠给支招!!
貌似方法1还是比较简单的,但是我用VC++怎么封装.h和.lib呢?是不是封装完后还有再重新封装dll,因为原来的dll是基于原始的.h和.lib而不是封装成dll的.h和.lib(说的好绕啊,不知道大家明白没...)

回复评论 (23)

共享内存
点赞  2009-3-9 19:53
消息 SOCKET 共享内存 管道等.
点赞  2009-3-9 23:28
事件与消息
点赞  2009-3-10 08:32
共享内存,加事件
点赞  2009-3-9 18:57
剪切板 com组件
点赞  2009-3-9 23:45
和PC上进程之间通讯差不多,这方面的文章网上还是比较多的
点赞  2009-3-10 08:10
我今天又试了共享内存的方法,但发现还是需要一个消息机制让程序A告知程序B去读数据,已经B通知A数据已读完。

方法可能有:
1、还是COPYDATA:Ce上实现较难,因为.net cf把好多东西都精简掉了,暂时不考虑
2、事件:我只是比较熟悉C#下的事件机制,不知道一个C#程序和一个C++程序之间怎么传递事件,难道说只负责发出去,对方是C#还是C++程序都无所?

PS:我还是不死心将B封装成dll或者com这种方法,想请问大家把C++的例如ffmepg的sdk封装成dll或者com后,还需要.h和.lib吗?我只想要dll或者com在C#中使用,而.h那些C#是不能用的呀!

烦请大家继续指点!!
点赞  2009-3-11 17:11
事件机制跟C++/C#语言无关
点赞  2009-3-12 21:40

10楼 红旗照耀全 该用户已被删除

提示: 作者被禁止或删除 内容自动屏蔽
点赞  2009-3-13 10:30
COPYDATA 完全可用的, 实在不行就用内存映射文件好了
点赞  2009-3-13 10:09
曙光同学能不能详细说一下COPYdata呢?
我试过在Window下用COPYdata成功的,程序A向程序B发送消息,B能收到。
但是因为ce下不支持对WndProc的重载,需要先继承一个MessageWindow类,再重载WndProc方法,但是我这样写了程序C后发现,虽然程序A向C发送信息成功,但C貌似没有收到,没有任何反应,我百思不得其解,所以就只好放弃了这个办法

另外,关于CE下共享内存的方法,还存在一个进程间同步的问题,一个应用程序在对某块内存进行写操作的时候,不希望另一个程序对同一块区域进行读操作。本来想用Semaphore,但发现ce下不支持。而我理解lock,ManulResetEvent那些同步方法,好像又是针对同一进程的不同线程的同步,对两个独立的应用程序间的内存同步是不是起不到作用呢?

还望大家解惑!谢谢!
点赞  2009-3-16 14:53
菜鸟中,路过学习,只简单使用过COMPYDATA,传递数据,觉得这样最方便.

windows中进程通讯的方法:
方法一:WM_COPYDATA   
  HWND   hReceiveDataWindow   =   FindWindow(NULL,....)   
  COPYDATASTRUCT   data;   
  data.cbdata   =   strlen(pStr);   
  data.lpData   =   pStr;   
  SendMessage(hReceiveDataWindow   ,WM_COPYDATA,(WPARAM)GetFocus(),(LPARAM)&data);   

REF.最简单的方式
http://www.cppblog.com/TechLab/archive/2005/12/30/2272.aspx
   
  方法二:dll共享   
  #pragma   data_seg   (".ASHARE")   
  int   iWhatYouUseInTwo   =   0;   
  #pragma   data_seg()   
   
  方法三:映象文件   
  CreateFileMapping   

REF.最基础,效率最高的方法
最好的参考书《Windows核心编程》第17章 内存映射文件
http://blog.codingnow.com/2005/10/interprocess_communications.html

   
  方法四:匿名管道:CreatePipe   
   
  方法五:命名管道:createnamedpipe   
   
REF.
http://www.pediy.com/bbshtml/bbs8/pediy8-724.htm


  方法六:邮件通道   
  createmailslot   
   
  方法七:网络接口,socket,但要求有网卡。可以实现不同主机间的IPC

另一篇总结的比较好的文章
http://www.seeitco.com/doc/Html/Visual%20C++/205637623.html

点赞  2009-3-16 16:31
学习
点赞  2009-3-19 10:01
总结的很好啊。。学习了:)
点赞  2009-3-19 09:15
学习了,

setevent
点赞  2009-3-19 09:42
引用: 引用 12 楼 lijinyan3000 的回复:
菜鸟中,路过学习,只简单使用过COMPYDATA,传递数据,觉得这样最方便.

windows中进程通讯的方法:
方法一:WM_COPYDATA  
  HWND  hReceiveDataWindow  =  FindWindow(NULL,....)  
  COPYDATASTRUCT  data;  
  data.cbdata  =  strlen(pStr);  
  data.lpData  =  pStr;  
  SendMessage(hReceiveDataWindow  ,WM_COPYDATA,(WPARAM)GetFocus(),(LPARAM)&data);  

REF.最简单的方式
http://www.cppblog.com/TechLab…


windows上能用的方法wince不一定能用!!!
点赞  2009-3-19 09:57
原来有这么多方法!
点赞  2009-3-19 10:25
引用: 引用 6 楼 xqhrs232 的回复:
事件与消息

这个比较适合c++
点赞  2009-3-25 15:32
引用: 引用 15 楼 constantine 的回复:
引用 12 楼 lijinyan3000 的回复:
菜鸟中,路过学习,只简单使用过COMPYDATA,传递数据,觉得这样最方便.

windows中进程通讯的方法:
方法一:WM_COPYDATA
HWND? hReceiveDataWindow? =? FindWindow(NULL,....)
COPYDATASTRUCT? data;
data.cbdata? =? strlen(pStr);
data.lpData? =? pStr;
SendMessage(hReceiveDataWindow? ,WM_COPYDATA,(WPARAM)GetFocus(),(LPARAM)&data);

REF.最简单的方式
http://www.cppblog.com…

FindWindow SendMessage我组合使用过,在WinCE下面使用没有问题,只是传入的参数有所差异,可以试试,c++的用法
点赞  2009-3-25 15:33
12下一页
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复