不创建窗口,两个windows进程(假如是两个控制台程序)之间发送消息 windows进程间通信 无窗口程序互发消息 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 网上看了一些朋友讲的例子,基本上都是 FindWindow来获取对方的窗口句柄,不过,我这里没有窗口,这个,这个…… 搜索 : windows 进程间通信或者读读 windows核心编程方法很多 看了一下windows进程间通信,不过那个 共享内存有些不明白: 这块共享内存是属于谁? 是属于 创建者的地址空间吗?还是属于系统?(测试发现好像是属于创建者地址空间,因为创建者进程玩完后,其他进程就不能访问共享内存了。) 我以为不论谁 CreateFileMapping 了共享内存,那这块内存就是系统的,大家公共可以用的了。如果是创建者的,那别的进程居然跑到它的地盘去了,这貌似违法了吧 1、不能使用自定义的消息,不能通过 SendMessage 或 PostMessage发送,因为是跨进程了,在消息接收方是无法读取别的进程空间中的内存数据。2、如果要发消息,可以使用WM_COPYDATA,系统保证跨进程间的内存数据的访问,当然这是需要窗口的。可以创建一个掩藏的窗口来接收消息。3、如果不想使用窗口发消息的方式,可以使用管道、内存映射、socket等方法实现进程间的通讯。 两个console间完全可以通过消息进行通讯,不过不通过窗口句柄的话只有PostThreadMessage()可用。另外你也可以手工创建一个Message Window专门接收处理消息。 消息循环很容易写,无非就是写一个循环调用GetMessage()/PeekMessage(),PostThreadMessage发送过来的消息需要在消息循环中进行判断和处理,但如果有窗口句柄的消息则需要调用TranslateMessage()然后DispatchMessage()让窗口关联的WndProc()进行处理。另外需要注意一点,消息队列是关联到线程的,所有需要处理消息的线程必须都有消息循环,而且该消息队列只会接受该线程创建的窗口句柄的消息和PostThreadMessage发送过来的无窗口消息。 共享内存共享的是物理内存,而不是共享各个进程的虚拟地址,即使各个进程访问各自不同的虚拟地址,但它们访问的是同一块物理内存,这才是内存共享。 这也就是为什么共享内存中不能共享指针类变量的原因,因为指针变量内保存的是进程的虚拟地址,只对本进程有效。原来如此,谢谢!另外,我如何在线程之间发送消息呢?PostThreadMessage 需要线程id,那么另外一个进程,它怎么知道这个线程ID? 1.既然不能使用自定消息(因为自定义消息属于某个进程,而不是属于系统,对吗?)直接在进程之间发,那么把这个自定义消息注册一下后呢?能发吗? 比如 WM_CREATE这种系统 消息,能发吗? WM_TIMER 消息能发吗?2. 线程之间发送消息,PostThreadMessage 需要为这个线程写一个专门的消息环吗? 1.既然不能使用自定消息(因为自定义消息属于某个进程,而不是属于系统,对吗?)直接在进程之间发,那么把这个自定义消息注册一下后呢?能发吗? 比如 WM_CREATE这种系统 消息,能发吗? WM_TIMER 消息能发吗?2. 线程之间发送消息,PostThreadMessage 需要为这个线程写一个专门的消息环吗?别把消息想象得那么神秘,所谓自定义消息只不过是个编号而已,只要发送方和接收方约定了该编号的意义就行了。所谓不能跨进程指的是你不能发送方自说自话定义了一个编号的意思就发给不知道这个编号意义的其它进程,对方当然不会处理了。 另外对消息来说跨进程这个概念没太大意义,因为消息是针对线程来说的,跨进程其实就是跨线程 -- 唯一的区别在于跨进程时消息参数中不能涉及指针类型的变量(因为指针只在当前进程有效)消息循环并不神秘,在任何函数中写下类似如下的循环代码即可让运行该函数的线程处理消息(所有消息):MSG msg;while( GetMessage(&msg, NULL, 0, 0) ){ if( msg.hwnd ) // 消息是发送给当前线程创建的窗口 { TranslateMessage(&msg); DispatchMessage(&msg); // 调用窗口关联的wndproc处理消息 } else // 消息是通过PostThreadMessage发送给当前线程的 { switch(msg.message) { case WM_MYMESSAGE1: ....; break; case WM_MYMESSAGE2: ....; break; .... } }} 不要做A语言代码修改为B语言代码的无用功。也不要做用A语言代码直接调用B语言代码库这样复杂、这样容易出错的傻事。只需让A、B语言代码的输入输出重定向到文本文件,或修改A、B语言代码让其通过文本文件输入输出。即可很方便地让A、B两种语言之间协调工作。比如:A将请求数据写到文件a.txt,写完后改名为aa.txtB发现aa.txt存在时,读取其内容,调用相应功能,将结果写到文件b.txt,写完后删除aa.txt,改名为bb.txtA发现bb.txt存在时,读取其内容,读完后删除bb.txt以上A可以替换为任何一种开发语言或开发环境,B可以替换为任何一种与A不同的开发语言或开发环境。除非A或B不支持判断文件是否存在、文件读写和文件更名。但是谁又能举出不支持判断文件是否存在、文件读写和文件更名的开发语言或开发环境呢?共享临时文本文件这种进程之间的通讯方法相比其它方法的优点有很多,下面仅列出我现在能想到的:·进程之间松耦合·进程可在同一台机器上,也可跨机,跨操作系统,跨硬件平台,甚至跨国。·方便调试和监视,只需让第三方或人工查看该临时文本文件即可。·方便在线开关服务,只需删除或创建该临时文本文件即可。·方便实现分布式和负载均衡。·方便队列化提供服务,而且几乎不可能发生队列满的情况(除非硬盘空间满)·…… 你的问题都可以解决,但又何必搞得那么麻烦,CreateWindowEx、FindWindow就可以解决。完成工作才是最重要的,楼主你说呢 c++改变鼠标形状 想钻研windows下进程间通信,求好书 如何把.exe文件转换成.dll或.ocx文件,以供asp调用 vector ? 属性页标题标签的字体问题!求助 请问一个关于RichEditCtrl的问题 void G_fsort(int& number); 菜鸟问题:HANDLE是什么意思?它和HWND有没有什么关系? 很急,希望大家帮忙看看,一个用VC做的程序发布,做安装程序的问题 执行程序!时遇到的问题 关于路由表和路由过程 关于mfc动画效果的设计
2、如果要发消息,可以使用WM_COPYDATA,系统保证跨进程间的内存数据的访问,当然这是需要窗口的。可以创建一个掩藏的窗口来接收消息。
3、如果不想使用窗口发消息的方式,可以使用管道、内存映射、socket等方法实现进程间的通讯。
共享内存共享的是物理内存,而不是共享各个进程的虚拟地址,即使各个进程访问各自不同的虚拟地址,但它们访问的是同一块物理内存,这才是内存共享。 这也就是为什么共享内存中不能共享指针类变量的原因,因为指针变量内保存的是进程的虚拟地址,只对本进程有效。原来如此,谢谢!
另外,我如何在线程之间发送消息呢?
PostThreadMessage 需要线程id,那么另外一个进程,它怎么知道这个线程ID?
1.既然不能使用自定消息(因为自定义消息属于某个进程,而不是属于系统,对吗?)直接在进程之间发,那么把这个自定义消息注册一下后呢?能发吗? 比如 WM_CREATE这种系统 消息,能发吗? WM_TIMER 消息能发吗?2. 线程之间发送消息,PostThreadMessage 需要为这个线程写一个专门的消息环吗?
1.既然不能使用自定消息(因为自定义消息属于某个进程,而不是属于系统,对吗?)直接在进程之间发,那么把这个自定义消息注册一下后呢?能发吗? 比如 WM_CREATE这种系统 消息,能发吗? WM_TIMER 消息能发吗?2. 线程之间发送消息,PostThreadMessage 需要为这个线程写一个专门的消息环吗?别把消息想象得那么神秘,所谓自定义消息只不过是个编号而已,只要发送方和接收方约定了该编号的意义就行了。所谓不能跨进程指的是你不能发送方自说自话定义了一个编号的意思就发给不知道这个编号意义的其它进程,对方当然不会处理了。 另外对消息来说跨进程这个概念没太大意义,因为消息是针对线程来说的,跨进程其实就是跨线程 -- 唯一的区别在于跨进程时消息参数中不能涉及指针类型的变量(因为指针只在当前进程有效)消息循环并不神秘,在任何函数中写下类似如下的循环代码即可让运行该函数的线程处理消息(所有消息):MSG msg;while( GetMessage(&msg, NULL, 0, 0) )
{
if( msg.hwnd ) // 消息是发送给当前线程创建的窗口
{
TranslateMessage(&msg);
DispatchMessage(&msg); // 调用窗口关联的wndproc处理消息
}
else // 消息是通过PostThreadMessage发送给当前线程的
{
switch(msg.message)
{
case WM_MYMESSAGE1: ....; break;
case WM_MYMESSAGE2: ....; break;
....
}
}
}
也不要做用A语言代码直接调用B语言代码库这样复杂、这样容易出错的傻事。
只需让A、B语言代码的输入输出重定向到文本文件,或修改A、B语言代码让其通过文本文件输入输出。
即可很方便地让A、B两种语言之间协调工作。
比如:
A将请求数据写到文件a.txt,写完后改名为aa.txt
B发现aa.txt存在时,读取其内容,调用相应功能,将结果写到文件b.txt,写完后删除aa.txt,改名为bb.txt
A发现bb.txt存在时,读取其内容,读完后删除bb.txt
以上A可以替换为任何一种开发语言或开发环境,B可以替换为任何一种与A不同的开发语言或开发环境。
除非A或B不支持判断文件是否存在、文件读写和文件更名。
但是谁又能举出不支持判断文件是否存在、文件读写和文件更名的开发语言或开发环境呢?共享临时文本文件这种进程之间的通讯方法相比其它方法的优点有很多,下面仅列出我现在能想到的:
·进程之间松耦合
·进程可在同一台机器上,也可跨机,跨操作系统,跨硬件平台,甚至跨国。
·方便调试和监视,只需让第三方或人工查看该临时文本文件即可。
·方便在线开关服务,只需删除或创建该临时文本文件即可。
·方便实现分布式和负载均衡。
·方便队列化提供服务,而且几乎不可能发生队列满的情况(除非硬盘空间满)
·……
完成工作才是最重要的,楼主你说呢