在VC++6。0下利用消息实现内部进程通讯

合集下载

利用VC_6_0实现温度采集模块的串行通信

利用VC_6_0实现温度采集模块的串行通信
% 来稿日期: "##7 5 6" 5 "6
TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTU
中图分类号:UY98
本文所述系统 Y= 机与外围设备间选用 8 针串口的 DA 5 "9" 5 = 标准进行串口通信,因为互不使用对方的传送控制信 号,故采用三线制串口通信接线方法,即发送数据线 D[. : " 脚;、 接收数据线 U[. : 9 脚 ; 和信号地 LK. : $ 脚 ; 三脚相连, 其 (或线 ) (或线 ) 中接收数据针脚 与发送数据针脚 彼些交叉相连, 信号地对应相接。传输线采用屏蔽双绞线。这里计算机与外部 设备进行数据交换的示意图见图 6 ] " ^ 。
9) /) / 程序主控模块的实现步骤
(" ) 创建项目: 创建一个基于对话框的 +U& 应用程序项目, 命名为 &>00J@TGBK。 (/ ) 插人通信控件: 选择 RB>VNAD 菜单下 5KK W> RB>VNAD 子菜 单中的 &>0S>FNFD. GFK &>FDB>H. 选项,在弹出的对话框中双击 1NX@.DNBNK 5AD@MNO &>FDB>H. 项,则所有注册过的 5AD@MNO 控件出 现在 列 表 框 中 。 选 择 +@AB>.>CD &>00EF@AGD@>F. &>FDB>HY MNB.@>F () $ ,单击 :F.NBD 按钮即可将通信控件插人该工程。该插人动作 引起的变化一是在 &HG..%@NL 窗口中出现相应的 &+2&>00 类; 二是在对话框编辑器工具栏中出现该控件图标。 (9 ) 设置主界面, 添加控件及其控制变量: 在主对话框编辑 器窗口中添加 +2&>00 控件和其它需要的控件,为每一个控件 添加控制变量名和变量类型。设对应 +2&>00 控件的变量名为 变量类型选为 &+2&>00 类。本文所述系统采用的是 4 0Z&>0, 路热电偶采集温度,相应的 4 个接收显示温度数值的静态文本 框控件的控制变量依次设为 0Z.DB1NAN@MN$ = 0Z.DB1NAN@MN* , 变量 “自动发送 ” “开始接收 ” 主界面中 和 按钮控 类型选为 &2DB@FX 类。

vc 进程间通讯

vc 进程间通讯

好了我们下面来写两个进程来实现它们的通信, 事先说明我写的只是关键代码并不能直接运行
发送方:
void Send(char* pSnd)
{
if (OpenClipboard())
{
HANDLE hClip;
if (!CreatePipe(&m_hRead, &m_hWrite, &sa, 0)
{
return;
}
STARTUPINFO sui;
PROCESS_INFOMATION pi; // 保存了所创建子进程的信息
BOOL CreatePipe(PHANDLE hReadPipe, PHANDLE hWritePipe, LPSECURITY_ATTRIBUTES lpPipeAttributes, DWORD nSize)
这个API函数是有用来创建匿名管道的,它返回管道的读写句柄(hReadPipe,hWritePipe), 记住lpPipeAttributes不能为NULL,因为这意味着函数的返回句柄不能被子进程所继承,你要知道匿名管道可是实现父子进程通信的阿,只有当一个子进程从其父进程中继承了匿名管道句柄后,这两个进程才可以通信,lpPipeAttributes不为NULL还远不够,LPSECURITY_ATTRIBUTES这个结构体的内容去查MSDN吧,我只告诉你其中的BOOL bInheritHandle这个成员变量要赋值为TRUE, 这样才真正实现了子进程可以从父进程中继承匿名管道.
2. 匿名管道(Pipe)
现在大多数都是基于管道通信的,因为每两个进程都可以共享一个管道来进行单独的对话,就象打电话单独占用一条线路一样,而不必担心像剪贴板一样会有串音, 匿名管道是一种只能在本地机器上实现两个进程间通信的管道,它只能用来实现一个父进程和一个子进程之间实现数据传输.其实它是非常有用的,我做过一个实际的项目就是利用匿名管道,项目就是让我写一个Ping程序来监测网络的通信状况,并且要把统计结果和执行过程显示在我们的软件里, windows有一个自带的ping程序,而且有执行过程和统计,所以我没必要再发明一个(重复发明就等于犯罪----程序员要牢记阿), 只是windows的那个Ping程序的执行结果都显示在了CMD的界面上了,我需要把它提取出来显示在我们的软件界面上,于是我就利用了匿名管道实现了这个程序, 当我们的软件要启动Ping任务时,我就先CreatePipe创建匿名管道,再CreateProcess启动了windows下面的Ping程序(它作为我们软件的子进程),当然要把管道的读写句柄一起传给子进程,这样我就可以轻松的把Ping的执行结果了写入到我的Buffer里了,是不是很easy。

在VC++6.0下利用共享内存、消息实现内部进程通讯

在VC++6.0下利用共享内存、消息实现内部进程通讯

在VC++6.0下利用共享内存、消息实现内部进程通讯张中军;张忠英
【期刊名称】《电脑编程技巧与维护》
【年(卷),期】2004(000)005
【摘要】通过实例,介绍了如何利用共享内存方式和Winlows自定义消息实现两个进程的同机通讯.
【总页数】4页(P49-52)
【作者】张中军;张忠英
【作者单位】无
【正文语种】中文
【中图分类】TP312
【相关文献】
1.使用消息机制实现内部进程通讯 [J], 阎梅;王西武;李萍
2.Windows 98下利用VC++6.0实现多线程技术的方法 [J], 应珊红
3.VC++6.0下利用互斥量同步线程来实现文件读取进度条 [J], 李新川
4.在Delphi6.0下利用自定义消息实现内部进程通讯 [J], 王毅;陈立亮;刘蓉
5.Windows98下利用VC++
6.0的MSComm控件实现微机与8051单片机的串行通信 [J], 徐颖;王悦
因版权原因,仅展示原文概要,查看原文内容请购买。

VISUAL C 进程间数据通信的实现

VISUAL C  进程间数据通信的实现

Visual C++进程间数据通信的实现2006-01-1912:18:21来源:天极开发网友评论0条论坛在Windows系统中,各个应用程序(进程)之间常常需要交换、传递数据,这就要解决进程间的数据通信问题。

在最初的16位Windows3.x系统中,所有Windows应用程序共享单一地址,任何进程都能够对这一共享地址空间的数据进行读写操作。

随着Windwos98、WindowsNT、Windows2000等32位的操作系统的出现,规定每个进程都有自己的地址空间,一个Windows进程不能存取另一个进程的私有数据,也就是说,虽然两个进程可以用具有相同值的指针寻址,但所读写的只是它们各自的数据,这样就减少了进程之间的相互干扰。

那么上述技术的采用是否意味着各个应用程序之间不能进行数据交换了呢?答案当然是否定的,强大的Windows系统早已为我们设计了很多方案来解决进行间的通信问题,这里我们只探讨如何通过动态数据交换(DDE)方法实现进程间的数据通信。

本实例程序功能如下,服务器端有两个数据项,一个是输入的字符串,另一个是定时增加的整数。

运行该程序的两个实例后,两个程序就可以建立DDE连接,实现数据的传递,并将另外一个实例传送过来的数据显示出来。

下图为程序编译运行后的效果图:图一、DDE方法实现进程间数据通信程序的界面效果图一、实现方法自从微软推出Windows操作系统以来,动态数据交换(DDE)就已经成为Windows的部分,并且很多Windwos应用程序都使用了DDE技术来实现进程之间的数据交换。

DDE 是建立在Windows内部消息系统、全局和共享全局内存基础上的一种协议,用来协调Wind ows应用程序之间的数据交换和命令调用,它已经成为应用程序之间通信的一种常用方法。

DDE应用程序可以分为四种类型:客户类型、服务器类型、客户/服务器类型和监视器。

DDE会话发生在客户应用程序和服务器应用程序之间。

mprop

mprop

在VC++6.0下利用自定义消息实现内部进程通讯的一种方法内部进程间通讯和数据交换有多种方式:消息、共享内存、匿名(命名)管道、邮槽、Windows套接字等多种技术。

其中利用消息机制实现IPC(Inter Process Communication)虽然同其他方法相比有交换的数据量小、携带的信息少等缺点,但由于其实现方便、应用灵活而广泛应用于无须大量、频繁数据交换的内部进程通讯系统之中,尤其是对于在上层主控软件与底层工作软件之间的命令与响应上更能充分显示其良好的性能。

本文就通过编制一个主控软件和一个受其操作的底层工作软件来阐述如何用VC++6.0通过消息来实现内部进程通信。

一、Windows消息机制Windows是一种面向对象的体系结构,Windows环境和应用程序都是通过消息来交互的。

Windows应用程序开始执行后,Windows为该程序创建一个"消息队列(message queue)",用以存放邮寄给该程序可能创建的各种不同窗口的消息。

消息队列中消息的结构(MSG)为:typedef struct tagMSG{HWND hwnd;UINT message;WPARAM wParam;LPARAM lParam;DWORD time;POINT pt;}MSG;其中第一个成员变量是用以标识接收消息的窗口的窗口句柄;第二个参数便是消息标识号,如WM_PAINT;第三个和第四个参数的具体意义同message值有关,均为消息参数。

前四个参数是非常重要和经常用到的,至于后两个参数则分别表示邮寄消息的时间和光标位置(屏幕坐标)。

把消息传送到应用程序有两种方法:一种是由系统将消息"邮寄(post)"到应用程序的"消息队列"这是"进队消息"Win32 API有对应的函数:PostMessage(),此函数不等待该消息处理完就返回;而另一种则是由系统在直接调用窗口函数时将消息"发送(send)"给应用程序的窗口函数,属于"不进队消息"对应的函数是SendMessage()其必须等待该消息处理完后方可返回。

vc6.0使用教程详解

vc6.0使用教程详解

你首先要打开VC6.0界面,一般用得较多的是Win32控制台应用程序(源程序,扩展名.cpp),步骤是:(先工程—后文件—编译—连接---运行)1,建立一个工程,“文件”——“新建”,出现下面界面:选择“Win32 Console Application”(控制台应用程序,左边倒数第三个),命名工程名称,选择保存位置,点击“确定”,进入下一步,看到如下提示界面:建立一个空工程,对应其他需要的你一可以建立别的工程;点击“完成”,之后:显示你创建的工程的信息。

2,再在有一个的工程的条件下,我们再建立一个源文件;“文件”——“新建”(快捷键Ctri+N),出现:建立源文件,选择“C++ Source ”,一般都是建立这种文件的(适用在当文件中适用)如果要建立头文件的话,选择“C/C++ Header File”,(适用在多文件工程中使用)命名,文件名称,点击“确定”,之后:进入编辑区,在主界面编写代码:如下编写完之后呢:可以按编译按钮调试程序,看看有没有错误,有的话改正,没有的话就可以再按连接按钮检查连接(多文件工程时常用,检查文件间是否正常连接),最后,点运行按钮,就可以运行了。

如果是您有代码如:cpp文件,或.h 文件,想添加都VC6.0里来测试的话,可以这样做:首先,要理解一下文件扩展名为:cpp和.h文件扩张名是.h,代表的是头文件,一般是书写一些函数原型,以及一些在整个程序中常用到的结构体,频繁使用的函数说明,定义等等;文件扩张名为,cpp的,是C++中的源文件,也是最常用到的文件,每建立一个工程都要至少一个源文件(至少要有一个函数入口——主函数main() ),包含了核心代码;建立与运行说明:(以VC 6.0编译器为例,其他编译器类似)首先,打开VC 6.0编译环境;在菜单栏——文件(的下拉菜单中选择“新建”),在弹出的选择窗口中,选择Win32 Console Application(控制台应用程序),在填写工程名称,选择一个程序保存路径,点击“完成”,查看工程信息。

VC学习笔记之二:进程通信

VC学习笔记之二:进程通信

VC学习笔记之二:进程通信2 进程通信内部进程间通讯和数据交换有消息、共享内存、命名(匿名)管道、邮槽、Windows套接字等多种技术。

我们在今后的课程中将一一介绍。

为了不让其他进程和线程打扰,必需要设置最高的优先级,以下函数设置当前进程和线程到最高的优先级。

SetPriorityClass(GetCurrentProcess(), REALTIME_PRIORITY_CLASS);SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_TIME_CRITICAL);2.1 创建进程为了创建进程,需要定义安全属性并且接受一个句柄,可以用此句柄管理进程,比如:改变进程的优先级或者种植进程。

甚至在进程停止运行之后,只要有仍然打开的句柄,进程会继续存在。

为了销毁进程,需要关闭进程的所有句柄。

CreateProcess需要按如下形式调用:BOOL CreateProcess{LPCTSTR lpszImageName,LPCTSTR lpszCmdLine,LPSECURITY_ATTRIBUTES lpsaProcess,LPSECURITY_ATTRIBUTES lpsaThread,BOOL bInheritHandles,DWORD fdwCreate,LPVOID lpvEnvironment,LPTSTR lpszCurrentDir,LPSTARTUPINFO lpStartupInfo,LPPROCESS_INFORMATION lpProcInfo}参数说明:lpszImageName:此参数必须指向可执行文件名(比如,子进程)的字符串,而且不能包含任何命令行参数。

在定位此参数命名文件时,系统不搜索PA TH环境变量定义的目录。

因此程序必须放在当前目录下,或者该字符串必须包含整个路径名。

lpszCmdLine:如果不必传递命令行参数,此参数可以取NULL。

使用VC++6.0系统

使用VC++6.0系统

附录A:使用VC++6.0系统Visual C++6.0系统(简称为VC++6.0系统)是微软公司于1998年推出的基于windows 9x 和windows NT的优秀集成开发环境。

面向对象的程序设计方法与可视开发环境的完美结合,使VC++6.0系统深受广大软件开发者和程序设计人员的喜爱VC++6.0系统不仅是C++语言的集成开发环境,而且还是开发32位windoWS应用程序的强大工具。

它所提供的一系列功能丰富的编程工具,使编写在windoWS环境下运行的应用程序十分简洁、快速。

同时,基于类库的设计方法又使编写面向对象的程序变得更为简单,开发出的应用程序的代码效率高。

如果计算机上已经安装了VC++6.0系统,可通过用鼠标单击Microsoft ViruseC++6.0菜单项启动VC++6.0系统,屏幕上显示如图A.1所示的VC++6.0系统的主窗口。

由于设置不同,看到的窗口与图A.1所示的窗口可能有些差别。

图A.1 VC++6.0系统的主窗口下面简要介绍在VC ++6.0系统中开发应用程序的过程。

由于在数据结构课程实验中主要是完成有关C++语言方面的练习,而不去考虑编写Windows GUI(Graphic User Interface,图形用户界面)程序时的一些复杂情况,本章只介绍在VC++6.0系统下生成筒单的控制台(console)应用程序,即生成字符方式应用程序的过程。

在VC++6.0系统中.可以使用编写字符方式程序时常用的技术编写控制台应用程序。

具体地说,在程序中可以使用C++的stdio.h等头文件说明的函数读取输入的数据和显示输出等。

对于一个编写好的C++源程序.要想在VC++6.0系统环境下运行,需要经过以下步骤。

A.1 生成项目现在的应用程序,尤其是Windows 应用程序,一般由多个文件组成,其中包括源文件、头文件、资源文件等。

为使组成程序的所有文件能够形成一个有机的整体,引入了项目的概念,即把一个应用程序作为一个项目。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

内部进程间通讯和数据交换有多种方式:消息、共享内存、匿名(命名)管道、邮槽、Windows套接字等多种技术。

其中利用消息机制实现IPC虽然同其他方法相比有交换的数据量小、携带的信息少等缺点,但由于其实现方便、应用灵活而广泛应用于无须大量、频繁数据交换的内部进程通讯系统之中,尤其是对于在上层主控软件与底层工作软件之间的命令与响应上更能充分显示其良好的性能。

本文就通过编制一个主控软件和一个受其操作的底层工作软件来阐述如何用VC++6.0通过消息来实现内部进程通信。

一、Windows消息机制
Windows是一种面向对象的体系结构,Windows环境和应用程序都是通过消息来交互的。

Windows应用程序开始执行后,Windows为该程序创建一个"消息队列(message queue)",用以存放邮寄给该程序可能创建的各种不同窗口的消息。

消息队列中消息的结构(MSG)为:typedef struct tagMSG{
HWND hwnd;
UINT message;
WPARAM wParam;
LPARAM lParam;
DWORD time;
POINT pt;
}MSG;
其中第一个成员变量是用以标识接收消息的窗口的窗口句柄;第二个参数便是消息标识号,如WM_PAINT;第三个和第四个参数的具体意义同message值有关,均为消息参数。

前四个参数是非常重要和经常用到的,至于后两个参数则分别表示邮寄消息的时间和光标位置(屏幕坐标)。

把消息传送到应用程序有两种方法:一种是由系统将消息"邮寄(post)"到应用程序的"消息队列"这是"进队消息"Win32 API有对应的函数:
PostMessage(),此函数不等待该消息处理完就返回;而另一种则是由系统在直接调用窗口函数时将消息"发送(send)"给应用程序的窗口函数,属于"不进队消息"对应的函数是SendMessage()其必须等待该消息处理完后方可返回。

二、主控程序的实现
(1)新建一工程文件:Sender,选取MFC AppWizard(exe)。

(2)第二步选取Single document(单文档)。

(3)其余几步均为确省值。

(4)添加三个菜单"命令一"、"命令二"、"命令三"及与之对应的函数:
OnSendComm1()
{
CString str="Receiver";
CWnd *pWnd=CWnd::FindWindow(NULL,str);
if(pWnd)
pWnd->SendMessage(WM_COMM,0,0);
}
OnSendComm2()
{
CString str="Receiver";
CWnd *pWnd=CWnd::FindWindow(NULL,str);
if(pWnd)
pWnd->SendMessage(WM_COMM,0,1);
}
OnSendComm3()
{
CString str="Receiver";
CWnd *pWnd=CWnd::FindWindow(NULL,str);
if(pWnd)
pWnd->SendMessage(WM_COMM,1,0);
(5)在SenderView.h中添加自定义消息:#define WM_COMM WM_USER+100编译完成即可。

三、底层工作程序的实现
(1)新建工程Receiver、仍是单文档。

(2)在CReceiverApp类的InitInstance()函数末尾添加:
m_pMainWnd->SetWindowText("Receiver");
用以指定底层工作程序的窗口标题,以便主控程序能根据标题获取到此窗口的窗口句柄。

(3)在MainFrm.h中添加自定义消息:#define WM_COMM WM_USER+100。

(4)添加自定义消息WM_COMM的消息映射:
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
//{{AFX_MSG_MAP(CMainFrame)
// NOTE - the ClassWizard will add and remove mapping macros here.
// DO NOT EDIT what you see in these blocks of generated code !
ON_WM_CREATE()
//}}AFX_MSG_MAP
ON_MESSAGE(WM_COMM,OnSendMsg)
END_MESSAGE_MAP()
(5)完成消息响应函数OnSendMsg()
void CMainFrame::OnSendMsg(WPARAM wParam, LPARAM lParam)
{
if(wParam==0 && lParam==0)
AfxMessageBox("主控程序发送命令一!");
if(wParam==0 && lParam==1)
AfxMessageBox("主控程序发送命令二!");
if(wParam==1 && lParam==0)
AfxMessageBox("主控程序发送命令三!");
}
我们便可以通过辨别消息的两个消息参数来区分主控程序发送的是哪一个命令从而可以执行相应的操作。

执行主控程序和底层工作程序由于本程序采用的是SendMessage()所以当主控程序发送消息给底层工作程序时,底层工作程序弹出响应的模式对话框,在没有关闭对话框前此消息未处理完,SendMessage()也就没有执行完,所以主控程序呈阻塞状态,如改用PoseMessage()则不会发生阻塞,具体选用哪个函数还应根据实际要求灵活掌握。

结论: 通过上面的实例可以看出利用消息进行进程间通信不失为一种便捷的方法,进程间的数据交换量不大却能完成相当的功能,上下层次有着明显的接口,上层和底层只通过这个接口进行通讯,因此只要对上下层程序制定好规范详尽的协议便可编制出协调性很好的软件控制系统。

相关文档
最新文档