版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Visual C+进程间数据通信的实现2006-01-19 12:18:21来源: 天极开发网友评论0 条 论坛在Windows系统中,各个应用程序(进程)之间常常需要交换、传递数据,这就要解决进程间的数据通信问题。在最初的16位Windows3.x系统中,所有Windows应用程序共享单一地址,任何进程都能够对这一共享地址空间的数据进行读写操作。随着Windwos98、WindowsNT、Windows2000等32位的操作系统的出现,规定每个进程都有自己的地址空间,一个Windows进程不能存取另一个进程的私有数据,也就是说,虽然两个进程可以用具有相同值的指针寻址,但所读写的只是
2、它们各自的数据,这样就减少了进程之间的相互干扰。那么上述技术的采用是否意味着各个应用程序之间不能进行数据交换了呢?答案当然是否定的,强大的Windows系统早已为我们设计了很多方案来解决进行间的通信问题,这里我们只探讨如何通过动态数据交换(DDE)方法实现进程间的数据通信。 本实例程序功能如下,服务器端有两个数据项,一个是输入的字符串,另一个是定时增加的整数。运行该程序的两个实例后,两个程序就可以建立DDE连接,实现数据的传递,并将另外一个实例传送过来的数据显示出来。下图为程序编译运行后的效果图: 图一、DDE方法实现进程间数据通信程序的界面效果图 一、实现方法 自从微软推出Windows操作
3、系统以来,动态数据交换(DDE)就已经成为Windows的部分,并且很多Windwos应用程序都使用了DDE技术来实现进程之间的数据交换。DDE是建立在Windows内部消息系统、全局和共享全局内存基础上的一种协议,用来协调Windows应用程序之间的数据交换和命令调用,它已经成为应用程序之间通信的一种常用方法。 DDE应用程序可以分为四种类型:客户类型、服务器类型、客户/服务器类型和监视器。DDE会话发生在客户应用程序和服务器应用程序之间。客户应用程序从服务器应用程序请求数据或服务,服务器应用程序响应客户应用程序的数据或服务请求。客户/服务器应用程序是既可以发出请求,又可以提供信息,监视器应
4、用程序则是用语调试的目的。 DDE协议使用三级树型命名:服务(SERVICE)、主题(TOPIC)和数据项(ITEM)来标识DDE所要传送的数据单元。服务使应用程序具有了提供给其他程序的数据交换能力;主题类似于目录,是建立会话连接的参数:ITEM才是DDE具体通信时要传送的数据内容,比如一个数据或一个字符串。 动态交换管理库(DDEML)提供了DDE和应用程序级协议。使用DDEML开发的应用程序无论是在运行一致性方面还是在应用程序相互通信方面性能均优于没有使用DDEML的应用程序。而且DDEML的应用使得开发支持DDE的应用程序容易了许多。 建立DDE会话后,客户程序和服务器程序可以通过三种链
5、接方式进行数据交换,分别是:1、冷链接:客户程序申请数据,服务器程序立即给客户程序发送数据;2、温链接:服务器程序通知客户程序数据数据项发生了改变,但是并没有将已发生的值发送给客户程序。3、热链接:当数据项发生变化时,服务器程序立即把变化后的值发送给客户程序,这是最常用、最方便的方法,下面的例子就使用的这种方法。 DDE会话初始化 使用API函数DdeInitialize(),在DDEML中注册应用。 会话建立 服务器:注册服务DdeNameService. 客户:连接DdeConnect. 会话过程 类似于Windows的消息循环,会话的过程就是事务处理的过程。客户通过DdeClientTr
6、ansaction()来发出事务请求,通过DDE回调函数,服务器处理客户事务请求,返回DdeCreateDataHandle来发送数据,同时客户可以调用DdeGetData()获取数据。 会话结束 可由服务方或客户方来终止会话,推出程序时要注消服务,释放资源,调用DdeUninitialize()。 二、编程步骤 1、启动Visual C+6.0,新建一个基于对话框的MFC应用程序,取名为DDEdemo,添加两个Group Box控件并分别在其上放置编辑控件IDC_EDIT、静态控件ID_STATIC1、ID_STATIC2、 ID_STATIC3,用Wizard添加对应成员变m_edit(C
7、String类型),添加并将其Caption置空,最后的界面如图一所示; 2、使用CLASSWIZARD添加对话框函数,分别为WM_DESTORY、WM_INITDIALOG、WM_TIMER及IDC_EDIT的EN_CHANGE消息建立对应函数; 3、在DDEdemoDlg.CPP中加入#include "ddel.h"以使用DDEML函数。并添加以下宏定义和全局变量: #define NITEM 2 /定义ITEM的数量; const char szApp="Server" /server DDE服务名; const char szTopic=&qu
8、ot;Topic"/Server DDE目录名; const char *pszItemNITEM="Item1","Item2"/SERVER ITEM名称字符串数组; int count=0;/记数,在Static1中显示; CString ServerDataNITEM;/存放服务器中的数据项内容; HCONV hConv=0; /会话句柄; DWORD idlnst=0; /DDEML实例句柄; HWND hWnd; /窗口句柄; HANDLE hlnst; /实例句柄; HSZ hszApp=0; /SERVER服务字符串句柄; HS
9、Z hszTopic=0; /SERVER目录字符串句柄; HSZ hszItemNITEM; /Server ITEM字符串句柄; BOOL bConnect; / 建立连接标志; 4、输入代码,编译运行程序。三、程序代码 /DDE回调函数; HDDEDATA CALLBACK DdeCallback(UINT wType,UINT wFmt,HCONV hConv,HSZ Topic,HSZ Item, HDDEDATA hData,DWORD lData1,DWORD lData2) int I ; char tmp255; switch(wType) case XTYP_ADVSTAR
10、T: case XTYP_CONNECT:/请求连接; return (HDDEDATA)TRUE);/允许; case XTYP_ADVDATA: /有数据到来; for(I=0;I if(Item=hszItemI) DdeGetData(hData,(PBYTE)tmp,255,0);/取得数据; switch(I) case 0: SetDlgItemText(hWnd,IDC_STATIC2,tmp); break; case 1: SetDlgItemText(hWnd,IDC_STATIC3,tmp); break; return (HDDEDATA)DDE_FACK);/回执;
11、 case XTYP_ADVREQ: case XTYP_REQUEST:/数据请求; for(I=0;I if(Item=hszItemI) return(DdeCreateDataHandle(idlnst,(PBYTE)(LPCTSTR)ServerDataI, ServerDataI.GetLength()+1,0,Item,wFmt,0); return(0); / CddedemoDlg.cpp CDdedemoDlg:CDdedemoDlg(CWnd* pParent /*=NULL*/) : CDialog(CDdedemoDlg:IDD, pParent) /AFX_DATA
12、_INIT(CDdedemoDlg) m_edit = _T(""); /AFX_DATA_INIT / Note that LoadIcon does not require a subsequent DestroyIcon in Win32 m_hIcon = AfxGetApp()-> LoadIcon(IDR_MAINFRAME); void CDdedemoDlg:DoDataExchange(CDataExchange* pDX) CDialog:DoDataExchange(pDX); /AFX_DATA_MAP(CDdedemoDlg) DDX_Tex
13、t(pDX, IDC_EDIT1, m_edit); /AFX_DATA_MAP BEGIN_MESSAGE_MAP(CDdedemoDlg, CDialog) /AFX_MSG_MAP(CDdedemoDlg) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_WM_TIMER() ON_WM_DESTROY() ON_EN_CHANGE(IDC_EDIT1, OnChangeEdit1) /AFX_MSG_MAP END_MESSAGE_MAP() /CDdedemoDlg message handlers BOOL CDd
14、edemoDlg:OnInitDialog() CDialog:OnInitDialog(); / Add "About." menu item to system menu. / IDM_ABOUTBOX must be in the system command range. ASSERT(IDM_ABOUTBOX & 0xFFF0) = IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != NULL) CS
15、tring strAboutMenu; strAboutMenu.LoadString(IDS_ABOUTBOX); if (!strAboutMenu.IsEmpty() pSysMenu-> AppendMenu(MF_SEPARATOR); pSysMenu-> AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); / Set the icon for this dialog. The framework does this automatically / when the application's main wind
16、ow is not a dialog SetIcon(m_hIcon, TRUE); / Set big icon SetIcon(m_hIcon, FALSE); / Set small icon / TODO: Add extra initialization here hWnd=m_hWnd; if (DdeInitialize(&idlnst,(PFNCALLBACK)DdeCallback,APPCMD_FILTERINITS| CBF_FAIL_EXECUTES|CBF_SKIP_CONNECT_CONFIRMS|CBF_FAIL_SELFCONNECTIONS| CBF_
17、FAIL_POKES,0) MessageBox("DDE SERVER初始化失败!"); return FALSE; hlnst=AfxGetApp()-> m_hInstance; /创建DDE string hszApp=DdeCreateStringHandle(idlnst,szApp,0); hszTopic=DdeCreateStringHandle(idlnst,szTopic,0); for(int I=0;I hszItemI=DdeCreateStringHandle(idlnst,pszItemI,0); /注册服务; DdeNameServi
18、ce(idlnst,hszApp,0,DNS_REGISTER); bConnect=FALSE; SetTimer(1,1000,NULL);/开始定时; return TRUE; / return TRUE unless you set the focus to a control void CDdedemoDlg:OnSysCommand(UINT nID, LPARAM lParam) if (nID & 0xFFF0) = IDM_ABOUTBOX) CAboutDlg dlgAbout; dlgAbout.DoModal(); else CDialog:OnSysComma
19、nd(nID, lParam); / If you add a minimize button to your dialog, you will need the code below / to draw the icon. For MFC applications using the document/view model, / this is automatically done for you by the framework. void CDdedemoDlg:OnPaint() if (IsIconic() CPaintDC dc(this); / device context fo
20、r painting SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); / Center icon in client rectangle int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect); int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon
21、 + 1) / 2; / Draw the icon dc.DrawIcon(x, y, m_hIcon); else CDialog:OnPaint(); / The system calls this to obtain the cursor to display while the user drags / the minimized window. HCURSOR CDdedemoDlg:OnQueryDragIcon() return (HCURSOR) m_hIcon; void CDdedemoDlg:OnTimer(UINT nIDEvent) / TODO: Add your
22、 message handler code here and/or call default count+; ServerData1.Format("%d",count); SetDlgItemText(IDC_STATIC1,ServerData1); DdePostAdvise(idlnst,hszTopic,hszItem1);/通知更新; if(!bConnect)/如果没有建立连接 hConv=DdeConnect(idlnst,hszApp,hszTopic,NULL); /连接服务器端; if(hConv) /如果建立成功 DWORD dwResult; bConnect=TRUE; for(int I=0;I DdeClientTransaction(NULL,0,hConv,hszItemI,CF_TEXT,XTYP_ADVSTART, TIMEOUT_ASYNC,&dwResult); CDialog:OnTimer(nIDEvent); void CDdedemoDlg:OnDestroy() CDialog:OnDestroy(); / TODO: Add your mes
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024-2025学年反射疗法师大赛理论能力检测试卷及完整答案详解(各地真题)
- 2024-2025学年度冶金工业技能鉴定题库(黄金题型)附答案详解
- 2024-2025学年四川文化艺术学院单招《英语》考试彩蛋押题(考点精练)附答案详解
- 2024-2025学年度临床执业医师自我提分评估附完整答案详解(典优)
- 2024-2025学年度医师定期考核考前冲刺练习带答案详解AB卷
- 2024-2025学年度山东华宇工学院电视播音主持期末考试题库试题带答案详解(培优B卷)
- 2024-2025学年度刑法期末考试能力检测试卷含答案详解【培优B卷】
- 2024-2025学年度计算机四级能力检测试卷【A卷】附答案详解
- 2024-2025学年度中医执业医师考试彩蛋押题(有一套)附答案详解
- 2024-2025学年度河北省单招考试一类 《文化素质数学》全真模拟模拟题往年题考附答案详解
- (一模)2026年深圳市高三年级第一次调研考试数学试卷(含官方答案)
- 2026广东广州市海珠区凤阳街道第一批招聘雇员2人笔试模拟试题及答案解析
- 内河船舶事故案例分析
- 2026年莱芜职业技术学院单招文化素质模拟试题及答案解析(二)
- 2026年湖南中医药高等专科学校单招职业技能考试题库含答案解析
- 2025年江苏卫生健康职业学院单招职业适应性测试题库附答案
- 真空预压法地基处理质量控制要点及检验标准技术交底
- 2026年及未来5年市场数据中国通讯铁塔行业市场全景分析及投资战略规划报告
- 2026年全国计算机一级考试试题及答案
- 2025年UOM无人机理论培训合格证题库及答案
- 检验科危化品培训课件
评论
0/150
提交评论