实验一进程通信报告.docx
《实验一进程通信报告.docx》由会员分享,可在线阅读,更多相关《实验一进程通信报告.docx(11页珍藏版)》请在冰豆网上搜索。
实验一进程通信报告
西安电子科技大学
计算机学院
实
验
报
告
题目:
进程通信
专业:
计算机科学与技术
姓名
班级:
031213
学号:
时间:
2014年5月14日
内容摘要:
通信进程个数
2
采用的通信方式
剪贴板Cliborad
实验内容补充说明
无
一、分析和设计
1.理论分析
Windows剪贴板是一种开销较小的进程间通信机制,而且代码实现简单,但是稳定性欠佳。
Windows系统支持剪贴板的基本机制是由系统预留的一块全局共享内存,用来暂存各个进程间进行交换的数据。
提供数据的进程创建一个全局内存块,并将要传送的数据复制到该内存块,而接受数据的进程获取此内存块的句柄,并完成对该内存块的数据块的读取。
2.总体设计
利用Windows自带的剪贴板的功能,在VC6.0下建立俩个基于对话框的MFC程序,分别制作简单的图形界面,一个用来发送数据,一个用来接受数据。
二、详细实现
创建一个基于对话框的MFC工程取名为:
Clipboard,在对话框资源上放置两个编辑框控件其ID分别为:
IDC_EDIT_SEND和IDC_EDIT_RECV.再在这两个编辑框下方分别放置一个按钮,Caption属性分别设置为:
“发送”和“接收”。
ID分别设置为:
IDC_BTN_SEND和IDC_BTN_RECV.
可以使用剪贴板函数实现进程间的数据传输。
常用的剪贴板函数有:
//打开剪贴板
BOOLOpenClipboard();
//关闭剪贴板
BOOLCloseClipboard();
//清空剪贴板,并将所有权分配给打开剪贴板的进程
BOOLEmptyClipboard();
//按指定数据格式放置剪贴板数据,用之前必须使用OpenClipboard函数
HANDLESetClipboardData(UINTuFormat,HANDLEhMem);
//检测是否已经包含了所需要的数据
BOOLIsClipboardFormatAvailable(UINTuFormat);
//获取指定剪贴板数据
HANDLEGetClipboardData(UINTuFormat);
其中uFormat为剪贴板格式,见MSDN(微软开发者网络)描述,hMem为所申请的内存控制句柄。
我们这里实现采用的是CF_TEXT的字符串的剪贴板。
三、实验结果
利用剪贴板实现了进程间的通信。
四、心得体会
1.进程间的通信可以有11种实现方式,我们较多使用的是剪贴板,匿名管道,命名管道和、邮槽这四种方式。
本次实验是我第一次使用MFC,初步掌握了MFC的一些编程方法。
2.在本次实验实现时,我主要参考了孙鑫VC++视频中的第17讲,和网上的一篇关于进程通信blog(
3.本次实验是由本人独立完成,对Windows下的剪贴板API有所了解。
4.在之后我会用更多的方式来实现进程的通信,除了上述4种,还会学习共享内存,消息缓冲等方式。
提高自己对OS的认识。
五、附录
核心代码:
voidCTest01Dlg:
:
OnBtnSend()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
//TODO:
Addyourcontrolnotificationhandlercodehere
if(OpenClipboard())//能否打开剪贴板
{
CStringstr;
HANDLEhClip;//句柄
char*pBuf;
EmptyClipboard();//清空剪贴板,当前窗口为拥有者
GetDlgItemText(IDC_EDIT_SEND,str);
hClip=GlobalAlloc(GMEM_MOVEABLE,str.GetLength()+1);//多分配一个字节,防止丢失数据
//得到句柄
pBuf=(char*)GlobalLock(hClip);//加锁
strcpy(pBuf,str);//复制到内存
GlobalUnlock(hClip);//解锁
SetClipboardData(CF_TEXT,hClip);//文本格式
CloseClipboard();//关闭剪贴板
}
}
voidCTest01Dlg:
:
OnBtnRecv()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
if(OpenClipboard())//能否打开剪贴板
{
if(IsClipboardFormatAvailable(CF_TEXT))//判断是否可用
{
HANDLEhClip;
char*pBuf;
hClip=GetClipboardData(CF_TEXT);
pBuf=(char*)GlobalLock(hClip);//句柄转化为地址
GlobalUnlock(hClip);//解锁
SetDlgItemText(IDC_EDIT_RECV,pBuf);//将剪贴板的数据放入接受编辑框内
CloseClipboard();//关闭剪贴板
}
}
}
完全代码我已经贴在网上,点击一下链接可看到
全部代码:
//test01Dlg.cpp:
implementationfile
//
#include"stdafx.h"
#include"test01.h"
#include"test01Dlg.h"
#ifdef_DEBUG
#definenewDEBUG_NEW
#undefTHIS_FILE
staticcharTHIS_FILE[]=__FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
//CAboutDlgdialogusedforAppAbout
classCAboutDlg:
publicCDialog
{
public:
CAboutDlg();
//DialogData
//{{AFX_DATA(CAboutDlg)
enum{IDD=IDD_ABOUTBOX};
//}}AFX_DATA
//ClassWizardgeneratedvirtualfunctionoverrides
//{{AFX_VIRTUAL(CAboutDlg)
protected:
virtualvoidDoDataExchange(CDataExchange*pDX);//DDX/DDVsupport
//}}AFX_VIRTUAL
//Implementation
protected:
//{{AFX_MSG(CAboutDlg)
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
CAboutDlg:
:
CAboutDlg():
CDialog(CAboutDlg:
:
IDD)
{
//{{AFX_DATA_INIT(CAboutDlg)
//}}AFX_DATA_INIT
}
voidCAboutDlg:
:
DoDataExchange(CDataExchange*pDX)
{
CDialog:
:
DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAboutDlg)
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CAboutDlg,CDialog)
//{{AFX_MSG_MAP(CAboutDlg)
//Nomessagehandlers
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
//CTest01Dlgdialog
CTest01Dlg:
:
CTest01Dlg(CWnd*pParent/*=NULL*/)
:
CDialog(CTest01Dlg:
:
IDD,pParent)
{
//{{AFX_DATA_INIT(CTest01Dlg)
//NOTE:
theClassWizardwilladdmemberinitializationhere
//}}AFX_DATA_INIT
//NotethatLoadIcondoesnotrequireasubsequentDestroyIconinWin32
m_hIcon=AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
voidCTest01Dlg:
:
DoDataExchange(CDataExchange*pDX)
{
CDialog:
:
DoDataExchange(pDX);
//{{AFX_DATA_MAP(CTest01Dlg)
//NOTE:
theClassWizardwilladdDDXandDDVcallshere
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CTest01Dlg,CDialog)
//{{AFX_MSG_MAP(CTest01Dlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BtnSend,OnBtnSend)
ON_BN_CLICKED(IDC_BtnRecv,OnBtnRecv)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
//CTest01Dlgmessagehandlers
BOOLCTest01Dlg:
:
OnInitDialog()
{
CDialog:
:
OnInitDialog();
//Add"About..."menuitemtosystemmenu.
//IDM_ABOUTBOXmustbeinthesystemcommandrange.
ASSERT((IDM_ABOUTBOX&0xFFF0)==IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX<0xF000);
CMenu*pSysMenu=GetSystemMenu(FALSE);
if(pSysMenu!
=NULL)
{
CStringstrAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if(!
strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING,IDM_ABOUTBOX,strAboutMenu);
}
}
//Settheiconforthisdialog.Theframeworkdoesthisautomatically
//whentheapplication'smainwindowisnotadialog
SetIcon(m_hIcon,TRUE);//Setbigicon
SetIcon(m_hIcon,FALSE);//Setsmallicon
//TODO:
Addextrainitializationhere
returnTRUE;//returnTRUEunlessyousetthefocustoacontrol
}
voidCTest01Dlg:
:
OnSysCommand(UINTnID,LPARAMlParam)
{
if((nID&0xFFF0)==IDM_ABOUTBOX)
{
CAboutDlgdlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog:
:
OnSysCommand(nID,lParam);
}
}
//Ifyouaddaminimizebuttontoyourdialog,youwillneedthecodebelow
//todrawtheicon.ForMFCapplicationsusingthedocument/viewmodel,
//thisisautomaticallydoneforyoubytheframework.
voidCTest01Dlg:
:
OnPaint()
{
if(IsIconic())
{
CPaintDCdc(this);//devicecontextforpainting
SendMessage(WM_ICONERASEBKGND,(WPARAM)dc.GetSafeHdc(),0);
//Centericoninclientrectangle
intcxIcon=GetSystemMetrics(SM_CXICON);
intcyIcon=GetSystemMetrics(SM_CYICON);
CRectrect;
GetClientRect(&rect);
intx=(rect.Width()-cxIcon+1)/2;
inty=(rect.Height()-cyIcon+1)/2;
//Drawtheicon
dc.DrawIcon(x,y,m_hIcon);
}
else
{
CDialog:
:
OnPaint();
}
}
//Thesystemcallsthistoobtainthecursortodisplaywhiletheuserdrags
//theminimizedwindow.
HCURSORCTest01Dlg:
:
OnQueryDragIcon()
{
return(HCURSOR)m_hIcon;
}
voidCTest01Dlg:
:
OnBtnSend()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
//TODO:
Addyourcontrolnotificationhandlercodehere
if(OpenClipboard())//能否打开剪贴板
{
CStringstr;
HANDLEhClip;//句柄
char*pBuf;
EmptyClipboard();//清空剪贴板,当前窗口为拥有者
GetDlgItemText(IDC_EDIT_SEND,str);
hClip=GlobalAlloc(GMEM_MOVEABLE,str.GetLength()+1);//多分配一个字节,防止丢失数据
//得到句柄
pBuf=(char*)GlobalLock(hClip);//加锁
strcpy(pBuf,str);//复制到内存
GlobalUnlock(hClip);//解锁
SetClipboardData(CF_TEXT,hClip);//文本格式
CloseClipboard();//关闭剪贴板
}
}
voidCTest01Dlg:
:
OnBtnRecv()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
if(OpenClipboard())//能否打开剪贴板
{
if(IsClipboardFormatAvailable(CF_TEXT))//判断是否可用
{
HANDLEhClip;
char*pBuf;
hClip=GetClipboardData(CF_TEXT);
pBuf=(char*)GlobalLock(hClip);//句柄转化为地址
GlobalUnlock(hClip);//解锁
SetDlgItemText(IDC_EDIT_RECV,pBuf);//将剪贴板的数据放入接受编辑框内
CloseClipboard();//关闭剪贴板
}
}
}