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
原创粉丝点击