API函数 PostMessage和GetMessage能否在两个进程之间通信?

supernicksun 2007-10-19 01:36:57
一个A进程能否用PostMessage发送一个消息,使得一个B进程使用GetMessage将此消息获取到?
...全文
618 43 打赏 收藏 转发到动态 举报
写回复
用AI写文章
43 条回复
切换为时间正序
请发表友善的回复…
发表回复
supernicksun 2007-10-23
  • 打赏
  • 举报
回复
谢谢楼上,明白了。
arong1234 2007-10-23
  • 打赏
  • 举报
回复
要做有很多条件,首先通信双方都必须精细设计,以提供彼此通信支持
其次,你自己必须定义通信协议,包括怎么告诉对方等答案
“创建一个不可视的窗口”应该是比较简单而可行的方法,其他方法都比这个要复杂,在你没有时间去磨刀的情况下,还是选择他,否则我真怀疑你几个月内能不能搞明白
用不可见窗口,通过RegisterWindowMessage定义系统级的消息
通过消息映射来处理

对于你,应该是唯一可行的
supernicksun 2007-10-23
  • 打赏
  • 举报
回复
“笨一点方法,把自己写到文件让对方读出来”先不打算使用。
“创建一个不可视的窗口”尽量也不使用。

其他的路,再给指指。
w_anthony 2007-10-23
  • 打赏
  • 举报
回复
你先设法让对方认出来!
就像一间屋子里面有很多人,你想让特定的两个人之间交流,他们可以说话、写信、打手势、发短信、打手机,
但前提是你必须把他们两个人同其他人区分开来,你自己必须提供一个特定的标志符来让他们联系上,这就是两个人接头暗语。
笨一点方法,把自己写到文件让对方读出来,稍微聪明一点,创建一个不可视的窗口来让对方找,等等,方法有很多……
supernicksun 2007-10-23
  • 打赏
  • 举报
回复
如果可以实现的话,给我引引路也行,
我可以顺着往下学习调查一下。
supernicksun 2007-10-23
  • 打赏
  • 举报
回复
谢谢大家,各位提供的帮助对我来说都很有用。
因为以前没学习过,所以一些问题可能问的很无知,而且也没什么时间磨刀(笑)。

再总结一下问题:
目前要实现两个没有窗体的后台进程之间的通信,并且非得要用Win32API中的函数来完成,如何弄?
arong1234 2007-10-23
  • 打赏
  • 举报
回复
LZ:要是你问能不能,无论SendMessage/PostMessage/PostThreadMessage都可以做进程间通信,但是这个做起来有太多细节了,真的不能这样问下去
arong1234 2007-10-23
  • 打赏
  • 举报
回复
呵呵,我秉承助人为快乐之本,不做33楼明助人实害人之举
supernicksun 2007-10-23
  • 打赏
  • 举报
回复
得到自己的告诉别人

你如何描述另外一个线程,线程姓名?
--------------------------------
可以得到自己的id,但怎么去告诉别人呢。


现在想问的是:
PostThreadMessage如何进行两个进程之间的通信?
raptormk16 2007-10-23
  • 打赏
  • 举报
回复
LZ,没事的,我们不关心你是否耽搁时间,只要你的问题能体现出我们的水平就行了,当然你的问题也不能太低能了,那样就不能体现我们的水平了。 呵。
w_anthony 2007-10-23
  • 打赏
  • 举报
回复
LZ的问题很矛盾啊,想知道另一个进程的某一个线程ID,又没有什么标志符可以区分?
如果有多个控制台,那么LZ需要的到底是哪一个?
这就像去找人一样,不知道对方姓名、年龄、性别、样貌、身材、服饰,如果去找?
失散多年的母子相聚,好歹还有个胎记可以区分一下。
LZ必须先确定一个唯一的标志,然后再来让对方通过这个标志找到它!
arong1234 2007-10-23
  • 打赏
  • 举报
回复
我觉得对于这样的问题,提供的信息越多,耽误他时间也越多,不去系统看书,只能是害自己。在这所有的答案,谁能给你一个系统的答案呢?给了你答案你又能看懂几成呢?
凌枫 2007-10-23
  • 打赏
  • 举报
回复
如果你是想做进程通信的话,可以利用共享内存去做啊,那个方便一点。另外还有一个DataCopy。
这两个到网上查一下,就可以得到一些资料
凌枫 2007-10-23
  • 打赏
  • 举报
回复
两个进程定义相同的自定义消息名,当A进程发消息给B进程时,先通过FindWindow找到B进程的句柄,然后再根据句柄利用PostMessage把自定义的消息名发送过去就行了。和普通的发送消息一样,B进程要做相关的操作才能接收消息(自定义消息、消息映射,消息处理函数)。
arong1234 2007-10-23
  • 打赏
  • 举报
回复
磨刀不误砍柴工,不磨刀一定砍不了柴
arong1234 2007-10-23
  • 打赏
  • 举报
回复
一些基础的东西不可能通过“问”学会的,如果连消息发送、线程和窗口是啥,怎么获取都有问题,我觉得别人就是告诉你你也很难明白,得买书系统学,急不得的。即使告诉你俩代码,你也不能保证你用对啊
raptormk16 2007-10-23
  • 打赏
  • 举报
回复
得到自己的告诉别人

你如何描述另外一个线程,线程姓名?
arong1234 2007-10-23
  • 打赏
  • 举报
回复
24楼:显然不可能么,看名字就知道是得到“当前”线程的id
supernicksun 2007-10-23
  • 打赏
  • 举报
回复
GetCurrentThreadId()可以获取到另外一个进程的线程吗?
raptormk16 2007-10-23
  • 打赏
  • 举报
回复
进程通信方法可就多了

这里就有11种:

0。剪贴板Clipboard: 在16位时代常使用的方式,CWnd中提供支持

1。窗口消息 标准的Windows消息以及专用的WM_COPYDATA消息 SENDMESSAGE()接收端必须有一个窗口

2。使用共享内存方式(Shared Memory)
a.设定一块共享内存区域
HANDLE CreateFileMapping(HANDLE,LPSECURITY_ATTRIBUTES, DWORD, DWORD, DWORD, LPCSTR)
产生一个file-mapping核心对象
LPVOID MapViewOfFile(
HANDLE hFileMappingObject,
DWORD dwDesiredAcess,
DWORD dwFileOffsetHigh,
DWORD dwFileOffsetLow,
DWORD dwNumberOfBytesToMap
);
得到共享内存的指针
b.找出共享内存
决定这块内存要以点对点(peer to peer)的形式呈现
每个进程都必须有相同的能力,产生共享内存并将它初始化。每个进程
都应该调用CreateFileMapping(),然后调用GetLastError().如果传回的
错误代码是ERROR_ALREADY_EXISTS,那么进程就可以假设这一共享内存区 域已经被别的进程打开并初始化了,否则该进程就可以合理的认为自己 排在第 一位,并接下来将共享内存初始化。
还是要使用client/server架构中
只有server进程才应该产生并初始化共享内存。所有的进程都应该使用

HANDLE OpenFileMapping(DWORD dwDesiredAccess,
BOOL bInheritHandle,
LPCTSTR lpName);
再调用MapViewOfFile(),取得共享内存的指针
c.同步处理(Mutex)
d.清理(Cleaning up) BOOL UnmapViewOfFile(LPCVOID lpBaseAddress);
CloseHandle()

3。动态数据交换(DDE)通过维护全局分配内存使的应用程序间传递成为可能
其方式是再一块全局内存中手工放置大量的数据,然后使用窗口消息传递内存 指针.这是16位WIN时代使用的方式,因为在WIN32下已经没有全局和局部内存 了,现在的内存只有一种就是虚存。

4。消息管道(Message Pipe)
用于设置应用程序间的一条永久通讯通道,通过该通道可以象自己的应用程序
访问一个平面文件一样读写数据。
匿名管道(Anonymous Pipes)
单向流动,并且只能够在同一电脑上的各个进程之间流动。
命名管道(Named Pipes)
双向,跨网络,任何进程都可以轻易的抓住,放进管道的数据有固定的格 式,而使用ReadFile()只能读取该大小的倍数。
可以被使用于I/O Completion Ports

5 邮件槽(Mailslots)
广播式通信,在32系统中提供的新方法,可以在不同主机间交换数据,在 WIN9X下只支持邮件槽客户

6。Windows套接字(Windows Socket)
它具备消息管道所有的功能,但遵守一套通信标准使的不同操作系统之上的应 用程序之间可以互相通信。

7。Internet通信 它让应用程序从Internet地址上载或下载文件

8。RPC:远程过程调用,很少使用,因其与UNIX的RPC不兼容。

9。串行/并行通信(Serial/Parallel Communication)
它允许应用程序通过串行或并行端口与其他的应用程序通信

10。COM/DCOM
通过COM系统的代理存根方式进行进程间数据交换,但只能够表现在对接口 函数的调用时传送数据,通过DCOM可以在不同主机间传送数据。
加载更多回复(23)

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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