关于使用SendMessage 进行进程间的通信 传递结构体

lijiawlm 2009-07-25 09:28:50
服务器进程的代码

HWND hWnd = ::FindWindow(NULL , "MsgRecv");
Test x;
x.x = 1;
x.y = 2;

::SendMessage(hWnd , WM_USER_MESSAGE , 0 , (LPARAM)&x);



接受消息的进程的代码

LRESULT CMsgRecvDlg::ShowMessage(WPARAM wParam,LPARAM lParam)
{
Test* m = (Test*)lParam;
int x = m->x; //此处不知道为什么总是为0
int y = m->y; //同上
return 1;
}


Test 结构体声明

struct Test
{
int x ;
int y ;
};


请问 到底如何才能把这个Test传递过去 我在MsgRecv这个程序中下断点 总是发现注释中的问题
...全文
1033 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
test2002 2009-08-27
  • 打赏
  • 举报
回复
其实楼主,用简单的SendMessage(hwnd,WM_SETTEXT,0,(LPCTSTR)sText);
将你的数据强制转化为LPCTSTR,传送字符串地址。

然后在接收端重载WinProc,把lParam强制转化为你要的类型就可以了。

这个功能非常高效的。比WM_COPYDATA简单高效得多。我现在不同进程之间传送字符串就用SendMessage一条消息的。你把其他类型当字符串传就可以了。

lijiawlm 2009-07-25
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 ckt1120 的回复:]
你的方法传的是地址作为参数,在接收进程,读取该地址获得值就不同了.
通过WM_COPYDATA消息实现进程间通信:

发送端:
发送消息WM_COPYDATA  数据COPYDATASTRUCT


接收端:
add windows message handler  WM_COPY
OnCopyData 在该函数中进行处理.

[/Quote]

谢谢 测试通过了...
lijiawlm 2009-07-25
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 ljt3969636 的回复:]
这个病看好了,是不是应该加分呢 O(∩_∩)O

[/Quote]
不好意思...病好像没有看好...
不过这次不是0了 是一个很小的负数

上代码

LRESULT CMsgRecvDlg::ShowMessage(WPARAM wParam,LPARAM lParam) //获取消息
{
Test *x = (Test*)lParam;
int m = x->x;
int n = x->y;
return 1;
}


Test *px = new Test;
px->x = 4;
px->y = 5;
::SendMessage(hWnd , WM_USER_MESSAGE , 0 ,(LPARAM)px);

ckt 2009-07-25
  • 打赏
  • 举报
回复
你的方法传的是地址作为参数,在接收进程,读取该地址获得值就不同了.
通过WM_COPYDATA消息实现进程间通信:

发送端:
发送消息WM_COPYDATA 数据COPYDATASTRUCT


接收端:
add windows message handler WM_COPY
OnCopyData 在该函数中进行处理.
lijiawlm 2009-07-25
  • 打赏
  • 举报
回复
我如果声明了 可是又收不到消息 ???
需要增加消息映射吗 ?
lijiawlm 2009-07-25
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 lori227 的回复:]
我记得 OnCopyData 函数里 直接是 return TRUE;
不是return CDialog::OnCopyData(pWnd, pCopyDataStruct);
[/Quote]

不清楚怎么接收消息....


BOOL CMsgRecvDlg::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct)
{
Test *x = (Test*)pCopyDataStruct->lpData;
int m = x->x;
int n = x->y;
return TRUE;
}

他总是提示没有声明
lijiawlm 2009-07-25
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 ljt3969636 的回复:]
这个病看好了,是不是应该加分呢 O(∩_∩)O
C/C++ code
HWND hWnd= ::FindWindow(NULL ,"MsgRecv");
Test x;//临时变量,要用new x.x=1;
x.y=2;

::SendMessage(hWnd , WM_USER_MESSAGE ,0 , (LPARAM)&x);
要这个样子:

C/C++ code
HWND hWnd= ::FindWindow(NULL ,"MsgRecv");
Test* px=new Test;
px->x=1;
px->y=2;
::SendMessage(hWnd , WM_USER_MESSAGE ,0 , (LPARAM)px);
[/Quote]
呵呵 刚刚看上面的代码去了 半天没有刷新...
科技完美生活 2009-07-25
  • 打赏
  • 举报
回复
不是一个进程,其地址空间不一样吧
ysysbaobei 2009-07-25
  • 打赏
  • 举报
回复
顶下
ljt3969636 2009-07-25
  • 打赏
  • 举报
回复
这个病看好了,是不是应该加分呢 O(∩_∩)O

HWND hWnd = ::FindWindow(NULL , "MsgRecv");
Test x;//临时变量,要用new
x.x = 1;
x.y = 2;

::SendMessage(hWnd , WM_USER_MESSAGE , 0 , (LPARAM)&x);

要这个样子:


HWND hWnd = ::FindWindow(NULL , "MsgRecv");
Test* px=new Test;
px->x = 1;
px->y = 2;
::SendMessage(hWnd , WM_USER_MESSAGE , 0 , (LPARAM)px);
lori227 2009-07-25
  • 打赏
  • 举报
回复
我记得 OnCopyData 函数里 直接是 return TRUE;
不是return CDialog::OnCopyData(pWnd, pCopyDataStruct);
lijiawlm 2009-07-25
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 lori227 的回复:]
不同进程间 WM_COPYDATA  发送这个消息

C/C++ code//发送//set up a COPYDATASTRUCT structure for use with WM_COPYDATA cpData.dwData= (DWORD) nLevel;
cpData.cbData= strlen(szBuffer)+1;
cpData.lpData= szBuffer;//send the structure to Debug via the system LRESULT lResult= ::SendMessage(hWnd, WM_COPYDATA, (UINT) NULL, (long)&cpData);//接收消息BOOL CXXxDlg::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct)
[/Quote]

试试看
lori227 2009-07-25
  • 打赏
  • 举报
回复
不同进程间 WM_COPYDATA 发送这个消息



//发送
//set up a COPYDATASTRUCT structure for use with WM_COPYDATA
cpData.dwData = (DWORD) nLevel;
cpData.cbData = strlen(szBuffer) + 1;
cpData.lpData = szBuffer;

//send the structure to Debug via the system
LRESULT lResult = ::SendMessage(hWnd, WM_COPYDATA, (UINT) NULL, (long) &cpData);


//接收消息
BOOL CXXxDlg::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct)

lijiawlm 2009-07-25
  • 打赏
  • 举报
回复
你说的那个应该是PostMessage应该注意的问题吧
lijiawlm 2009-07-25
  • 打赏
  • 举报
回复
问题依旧 还是0
lijiawlm 2009-07-25
  • 打赏
  • 举报
回复
我试试看
lori227 2009-07-25
  • 打赏
  • 举报
回复
Test x;
这个声明为局部变量,出来函数已经不存在了,而你发送的只是一个指针!
把它声明为全局的~
lijiawlm 2009-07-25
  • 打赏
  • 举报
回复
由于现在需要更改程序架构 因此必须要使用进程间的通信....
麻烦一下大家了

64,649

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧