WINCE下的两种通信方式
来源:互联网 发布:暗黑破坏神2修改器 mac 编辑:程序博客网 时间:2024/04/28 01:20
1.1 WM_COPYDATA方法
使用WM_COPYDATA消息可以很方便地传递进程间的数据,具体定义如下:
SendMessage(hwnd,WM_COPYDATA,wParam,lParam);
其中wParam设置为包含数据的窗体的句柄,lParam指向一个COPYDATASTRUCT的结构:
typedef struct tagCOPYDATASTRUCT {
DWORD dwData; //用户定义数据
DWORD cbData; //数据大小
PVOID lpData; //指向数据的指针
} COPYDATASTRUCT
也就是通过COPYDATASTRUCT的结构来传递数据。
需要注意的是,WinCE提供的WM_COPYDATA消息来传递进程间的数据,并没有提供同步机制,所以必须要使用SendMessage函数来发送消息,且等待直到对方处理完后返回,而不能使用PostMessage函数来发送WM_COPYDATA。
具体过程如下:
接受方在DefWndProc事件中,来处理这条消息.由于中文编码是两个字节,所以传递中文时候字节长度要搞清楚. 用WM_COPYDATA的前提: 1,知道接收消息进程的句柄。 2,接收消息进程重载了WM_COPYDATA消息映射,能对其做出反应(否则不是发送端自作多情了?) 看过前提,的出结论:在自己写的两个进程间用WM_COPYDATA再好不过。 下面CODE几行就说明了一切。 获得句柄的方法,最简单的方法就是使用FindWindow,找窗口类,或者名,如果你觉得这样不把握,那就利用SetProp个窗口做个记号....(不说这些,跑踢儿了都) OK,开始写发送端代码: HWND hWnd = FindWindow(NULL,"MyApp"); if(hWnd!=NULL) { COPYDATASTRUCT cpd; /*给COPYDATASTRUCT结构赋值*/ cpd.dwData = 0; cpd.cbData = strlen("字符串"); cpd.lpData = (void*)"字符串"; ::SendMessage(hWnd,WM_COPYDATANULL,(LPARAM)&cpd);//发送! /*完事儿了!!*/ } 接收端重载ON_WM_COPYDATA消息映射函数(下面是手工所要加的,你最好还是用ClassWizard) afx_msg BOOL OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct); ON_WM_COPYDATA()/*消息映射*/ BOOL CMainFrame::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct) return CWnd::OnCopyData(pWnd, pCopyDataStruct);
首先,在发送方,用FindWindow找到接受方的句柄,然后向接受方发送WM_COPYDATA消息.
{
AfxMessageBox((LPCSTR)(pCopyDataStruct->lpData));/*利用对话框表示收到消息*/
}
进程通信还有其他一些手段,相对来说比较麻烦,但局限性要比WM_COPYDATA小。当然你也可以两端都注册一个消息来通信。
1.2 内存映射文件的方法
内存映射文件提供了一种完全不同的读写文件的方法,它是将文件内容映射到内存的某个区域,读写文件直接操作内存即可。下面介绍内存映射文件所需的API函数:
(1) 创建用于内存映射访问的文件
在WinCE中,要想创建或打开一个用于内存映射访问的文件,需要通过CreateFileForMapping函数来实现,它是CreateFile函数的一个特殊版本,专门提供给内存映射文件使用,CreateFileForMapping函数的定义如下:
HANDLE CreateFileForMapping (
LPCTSTR lpFileName,
DWORD dwDesiredAccess,
DWORD dwShareMode,
LPSECURITY_ATTRIBUTES lpSecurityAttributes,
DWORD dwCreationDisposition,
DWORD dwFlagsAndAttributes,
HANDLE hTemplateFile );
(2) 创建或打开内存映射文件对象
在使用内存映射文件时,需要创建或打开内存映射文件对象,它实际上是于已经创建或打开的文件建立连接。创建或打开内存映射对象通过CreateFileMapping函数实现,此函数定义如下:
HANDLE CreateFileMapping( HANDLE hFile, LPSECURITY_ATTRIBUTES lpFileMappingAttributes, DWORD flProtect, DWORD dwMaximumSizeHigh, DWORD dwMaximumSizeLow, LPCTSTR lpName );
);
成功创建内存映射文件对象,函数将返回一个内存映像对象句柄,如果在创建内存映射文件对象已存在,将直接返回已打开的内存映像文件对象句柄。
(3) 获取内存映像文件对象视图
当创建或打开了内存映射对象之后。接着就需要得到内存映射文件对象的数据内存指针,通过此指针则可以读写文件中的内容,也就是获取内存映射文件对象视图。得到内存映射文件对象的数据内存指针通过MapViewOfFile函数实现,此函数定义如下:
LPVOID MapViewOfFile( HANDLE hFileMappingObject, DWORD dwDesiredAccess, DWORD dwFileOffsetHigh, DWORD dwFileOffsetLow, DWORD dwNumberOfBytesToMap );
(4) 取消文件视图的映射
在使用完内存映射文件之后,还要调用UnmapViewOfFile函数取消文件视图,进行内存清理工作。此函数定义如下:
BOOL UnmapViewOfFile(
LPCVOID lpBaseAddress
);
这是继承通信时用到的主要函数
- WINCE下的两种通信方式
- 两台WINCE的网络通信
- HTTP通信的两种方式
- wince 应用和驱动通信的几种方式探讨
- wince 应用和驱动通信的几种方式探讨
- wince 通信方式
- wince 通信方式 SOCKET
- wince下的蓝牙串口通信
- winCE 下 evc 的 Socket 通信
- 实现可靠UDP通信的两种方式
- 通信格式的约定(两种方式)
- CISCO 不同VLAN之间相互通信的两种方式
- 黑马程序员_多线程间通信的两种方式
- 不同VLAN之间相互通信的两种方式
- nginx与php-fpm通信的两种方式
- 浅谈FPGA串口通信数据解析的两种方式
- C# 程序间通信的两种方式
- nginx与php-fpm通信的两种方式
- CString.Format 用法
- TCPL(The C Programming Language)读书笔记 第三章 流控制
- 分用完了。
- 十进制转二、八、十六进制
- nm - from Baidu Zhidao
- WINCE下的两种通信方式
- vc中调用MySql存储过程
- 模仿迅雷传输前创建临时文件,避免传输中间出现空间问题
- CSDN小秘书 v1.1
- Sqlite3支持的数据类型
- (js)用window.onload实现刷新页面的导航栏状态的切换
- [IE9] 如何开启IE9的GPU硬件加速
- Matlab中del2()函数学习笔记
- TCP建立和关闭连接