64位进程和32位进程通信问题
来源:互联网 发布:org.apache.http.wire 编辑:程序博客网 时间:2024/06/08 17:00
最近遇到一个问题,64位程序向32位程序发送一个WM_COPYDATA消息, 发现传递的数据和收到的数据不对
函数代码如下,
typedef struct tagCOPYDATASTRUCT { ULONG_PTR dwData; //用户定义数据 DWORD cbData; //用户定义数据的长度 __field_bcount(cbData) PVOID lpData; //指向用户定义数据的指针} COPYDATASTRUCT, *PCOPYDATASTRUCT;
发送方(64位程序)
void CSendDlg::OnDataSend(){ CWnd *pWnd = CWnd::FindWindow(NULL,"接收窗口的标题"); TCHAR msg[255] = "HELLO"; COPYDATASTRUCT cpd; cpd.dwData = 0; cpd.cbData = 255 + 1;//多加一个长度,防止乱码 cpd.lpData = @msg; pWnd->SendMessage(WM_COPYDATA,NULL,(LPARAM)&cpd);}
接收方(32位程序)
// 声明afx_msg void OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct);// 添加消息映射BEGIN_MESSAGE_MAP(CMainFrame, CCJMDIFrameWnd)ON_MESSAGE(WM_COPYDATA,OnCopyData)END_MESSAGE_MAP()// 函数实现CReceiveDlg::OnCopyData( WPARAM wParm, LPARAM lParm){ TCHAR msgReceive[256]; memset(msgReceive, 0, sizeof(msgReceive)); strcpy(msgReceive, pCopyDataStruct->lpData));}
原因
经分析,是由于传递数据是用的指针,所以会出现一个问题:指针在64位下的长度为64位,而在32位下的长度为32位,故当64位情况下指针高字节不为空时,实际上32位程序收到的指针只有低字节部分,高字节被截取了。
解决办法
发送方(64位程序)自定义一个消息通知接收方(32位程序),并把要传递的数据及相关参数的值保持到本地文件;接收方收到消息后,读取本地文件的值,再给自己发送WM_COPYDATA消息(这样写的好处是WM_COPYDATA的响应函数不用改写)。
代码如下
发送方(64位程序)
// 定义消息**#define WM_USERMSG WM_USER + 1111void CSendDlg::OnDataSend(){ CWnd *pWnd = CWnd::FindWindow(NULL,"接收窗口的标题"); /* 数据保存到本地代码略 */ pWnd->SendMessage(WM_USERMSG, NULL, 1);}
接收方(32位程序)
// 定义自定义消息**#define WM_USERMSG WM_USER + 1111// 声明afx_msg void OnCopyData(WPARAM wParm, LPARAM lParm);afx_msg void OnUerMsg(WPARAM wParm, LPARAM lParm);// 添加消息映射BEGIN_MESSAGE_MAP(CMainFrame, CCJMDIFrameWnd)ON_MESSAGE(WM_COPYDATA,OnCopyData)ON_MESSAGE(WM_USERMSG,OnUerMsg)END_MESSAGE_MAP()// WM_COPYDATA消息响应函数实现CReceiveDlg::OnCopyData( WPARAM wParm, LPARAM lParm){ TCHAR msgReceive[256]; memset(msgReceive, 0, sizeof(msgReceive)); strcpy(msgReceive, pCopyDataStruct->lpData));}// WM_USERMSG消息响应函数实现CReceiveDlg::OnUerMsg( WPARAM wParm, LPARAM lParm ){ /* 从本地读取数据代码略 */ TCHAR msg[255] = 赋值; COPYDATASTRUCT cpd; cpd.dwData = 赋值 cpd.cbData = 赋值 + 1;//多加一个长度,防止乱码 cpd.lpData = @msg; SendMessage(WM_COPYDATA,NULL,(LPARAM)&cpd);}
0 0
- 64位进程和32位进程通信问题
- 32位进程注入64位进程
- 32位进程注入64位进程
- 32位进程注入64位进程 .
- 32位进程注入64位进程
- 64位进程调用32位dll的解决方法 / 程序64位化带来的问题和思考
- 64位进程调用32位dll的解决方法 / 程序64位化带来的问题和思考
- Windows 64位系统下32位进程调用64位进程中的函数
- 解决64位进程调用32位库文件报错问题
- 解决64位进程调用32位库文件报错问题
- 解决64位进程调用32位库文件报错问题
- [问题记录.WinDbg]在64位系统上抓取32位进程的dump
- 解决64位进程调用32位库文件报错问题
- 64位进程调用32位dll的解决方法
- 64位进程调用32位dll的解决方法
- 64位进程调用32位dll的解决方法
- 64位进程调用32位dll的解决方法
- 64位进程调用32位dll的解决方法
- Intent的Flag简单实用
- Android抓取崩溃日志
- Android 底部弹出窗popuwindows含有list动态控制显示内容高度
- Linux-2.6.32 NUMA架构之内存和调度
- .Net Framework 4 如何静默安装
- 64位进程和32位进程通信问题
- maven于eclipse集成-2
- openssl: error while loading shared libraries: libssl.so.1.1
- 实现Freemarker生成word文档,内容可二次写入
- 【Android开发】问答机器人,聊天类App的开发制作过程记录
- 手势冲突,设置优先级
- 《linux内核完全剖析》笔记03-进程创建
- Shell - 23
- SparkR (R on Spark)