请问在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(说的好绕啊,不知道大家明白没...)
和PC上进程之间通讯差不多,这方面的文章网上还是比较多的
我今天又试了共享内存的方法,但发现还是需要一个消息机制让程序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#是不能用的呀!
烦请大家继续指点!!
COPYDATA 完全可用的, 实在不行就用内存映射文件好了
曙光同学能不能详细说一下COPYdata呢?
我试过在Window下用COPYdata成功的,程序A向程序B发送消息,B能收到。
但是因为ce下不支持对WndProc的重载,需要先继承一个MessageWindow类,再重载WndProc方法,但是我这样写了程序C后发现,虽然程序A向C发送信息成功,但C貌似没有收到,没有任何反应,我百思不得其解,所以就只好放弃了这个办法
另外,关于CE下共享内存的方法,还存在一个进程间同步的问题,一个应用程序在对某块内存进行写操作的时候,不希望另一个程序对同一块区域进行读操作。本来想用Semaphore,但发现ce下不支持。而我理解lock,ManulResetEvent那些同步方法,好像又是针对同一进程的不同线程的同步,对两个独立的应用程序间的内存同步是不是起不到作用呢?
还望大家解惑!谢谢!
菜鸟中,路过学习,只简单使用过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
引用: 引用 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不一定能用!!!
引用: 引用 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++的用法