实验一进程通信报告.docx

上传人:b****5 文档编号:7095418 上传时间:2023-01-17 格式:DOCX 页数:11 大小:44.09KB
下载 相关 举报
实验一进程通信报告.docx_第1页
第1页 / 共11页
实验一进程通信报告.docx_第2页
第2页 / 共11页
实验一进程通信报告.docx_第3页
第3页 / 共11页
实验一进程通信报告.docx_第4页
第4页 / 共11页
实验一进程通信报告.docx_第5页
第5页 / 共11页
点击查看更多>>
下载资源
资源描述

实验一进程通信报告.docx

《实验一进程通信报告.docx》由会员分享,可在线阅读,更多相关《实验一进程通信报告.docx(11页珍藏版)》请在冰豆网上搜索。

实验一进程通信报告.docx

实验一进程通信报告

 

西安电子科技大学

计算机学院

题目:

进程通信

专业:

计算机科学与技术

姓名

班级:

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();//关闭剪贴板

}

}

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 能源化工

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1