//////////////////////////////////////DDE回调函数; HDDEDATA CALLBACK DdeCallback(UINT wType,UINT wFmt,HCONV hConv,HSZ Topic,HSZ Item, HDDEDATA hData,DWORD lData1,DWORD lData2) { int I ; char tmp[255]; switch(wType) { case XTYP_ADVSTART: case XTYP_CONNECT://请求连接; return ((HDDEDATA)TRUE);//允许; case XTYP_ADVDATA: //有数据到来; for(I=0;I<NITEM;I++) if(Item==hszItem[I]) { 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);//回执; case XTYP_ADVREQ: case XTYP_REQUEST://数据请求; for(I=0;I<NITEM;I++) if(Item==hszItem[I]) return(DdeCreateDataHandle(idlnst,(PBYTE)(LPCTSTR)ServerData[I], ServerData[I].GetLength()+1,0,Item,wFmt,0)); } return(0); }
///////////////////////////////////////////////////// CddedemoDlg.cpp CDdedemoDlg::CDdedemoDlg(CWnd* pParent /*=NULL*/) : CDialog(CDdedemoDlg::IDD, pParent) { //{{AFX_DATA_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_Text(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 CDdedemoDlg::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) { CString 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 window 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_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<NITEM;I++) hszItem[I]=DdeCreateStringHandle(idlnst,pszItem[I],0); //注册服务; DdeNameService(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::OnSysCommand(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 for 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 + 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 message handler code here and/or call default count++; ServerData[1].Format("%d",count); SetDlgItemText(IDC_STATIC1,ServerData[1]); DdePostAdvise(idlnst,hszTopic,hszItem[1]);//通知更新; if(!bConnect)//如果没有建立连接 { hConv=DdeConnect(idlnst,hszApp,hszTopic,NULL); //连接服务器端; if(hConv) //如果建立成功 { DWORD dwResult; bConnect=TRUE; for(int I=0;I<NITEM;I++) DdeClientTransaction(NULL,0,hConv,hszItem[I],CF_TEXT,XTYP_ADVSTART, TIMEOUT_ASYNC,&dwResult); } } CDialog::OnTimer(nIDEvent); }
void CDdedemoDlg::OnDestroy() { CDialog::OnDestroy(); // TODO: Add your message handler code here KillTimer(1);//销毁定时; DdeNameService(idlnst,0,0,DNS_UNREGISTER);//注销服务; DdeFreeStringHandle(idlnst,hszApp); DdeFreeStringHandle(idlnst,hszTopic); for(int I=0;I<NITEM;I++) DdeFreeStringHandle(idlnst,hszItem[I]); DdeUninitialize(idlnst); }
void CDdedemoDlg::OnChangeEdit1() { // TODO: If this is a RICHEDIT control, the control will not // send this notification unless you override the CDialog::OnInitDialog() // function and call CRichEditCtrl().SetEventMask() // with the ENM_CHANGE flag ORed into the mask. // TODO: Add your control notification handler code here UpdateData(); ServerData[0]=m_edit; DdePostAdvise(idlnst,hszTopic,hszItem[0]); //通知DDE更新该数据项目; } |
相关推荐
本教程将详细讲解如何利用Windows操作系统中的剪贴板功能实现进程间通信,以Visual C++作为开发环境。剪贴板作为一种共享内存区域,可以为多个进程提供一个安全、便捷的信息传递渠道。 首先,我们需要了解什么是...
套接字是网络通信的基础,它提供了进程间通信的能力,允许数据在网络中传输。读者会学习到如何创建、绑定、监听和接受连接等基本操作。 2. **TCP/IP协议**:TCP(传输控制协议)和IP(网际协议)是互联网通信的核心...
VC++环境下利用管道和线程实现进程间通信的技术是指在Windows操作系统中,使用Visual C++语言,通过创建管道和线程来实现进程之间的通信。这种技术可以在不同的进程之间实现信息交换,达到协作的效果。 进程间通信...
3. 进程间通信:如果新进程需要与父进程通信,可以使用管道、内存映射文件或消息队列等机制。 4. 错误处理:务必检查函数调用返回值,并对可能出现的错误进行处理。 在Visual C++环境中,还可以利用MFC(Microsoft ...
visual c++ MFC之Lesson17进程间通信
命名管道是Windows操作系统中一种进程间通信(IPC)机制,它允许不同的进程之间进行数据交换。在本文中,我们将深入探讨如何使用Visual C++来实现命名管道的通信,这是一种简单而有效的技术,尤其适用于在同一台...
在Windows操作系统中,VC++(Visual C++)提供了多种实现进程间通信的机制,包括管道、共享内存、套接字、消息队列等。本主题将主要讨论在VC++环境下,通过MFC(Microsoft Foundation Classes)库实现两个进程间的...
在Windows系统中,Visual C++(VC++)提供了多种方式来实现进程间的通信,其中之一就是共享内存。共享内存允许不同进程访问同一块内存区域,从而实现数据的共享。下面我们将深入探讨如何使用VC++通过共享内存进行多...
1. **套接字(Sockets)**:套接字是网络通信的基础,它提供了进程间通信的接口,使得运行在不同计算机上的程序能够相互通信。在Visual C++中,可以使用Winsock库来操作套接字。 2. **TCP/IP协议**:传输控制协议/...
- 进程间通信是不同进程之间交换数据或协调工作的方式。Windows提供了多种IPC机制,如管道、消息队列、共享内存、套接字、命名管道、事件、信号量等。 - 在这个示例中,DLL作为通信的媒介,可能使用了消息队列、...
在Windows操作系统中,通过消息机制实现进程间的通信是一种常见的方法,尤其是在使用Visual C++(VC++)进行开发时。本文将深入探讨如何使用VC++中的消息系统来实现实现进程间的通信。 首先,我们要理解Windows的...
Visual C++ 进程与线程 相关源代码,涵盖终止当前进程,获取系统进程,终止指定进程,在程序中启动程序,使用事件对象同步进程,在两个执行程序间进行数据通信,使用工作线程,正常终止线程,异常终止进程,使用线程...
1. **套接字(Sockets)**:套接字是网络通信的基础,是进程间通信的一种方式。在C++中,可以使用Winsock库或POSIX套接字API来创建和管理套接字。套接字分为流式(TCP)和数据报(UDP)两种类型,分别对应面向连接和...
### Visual C++ 实现进程间通信详解 #### 进程间通信的重要性与背景 在Windows系统环境下,进程间通信(IPC)是多个独立运行的进程能够互相协作、共享信息的关键技术。随着操作系统的演进,从早期的16位Windows 3....
5. **Windows API**:掌握如何直接调用Windows API来实现底层功能,如文件操作、进程间通信等。 6. **异常处理**:理解C++的异常处理机制,以及如何编写健壮的异常安全代码。 7. **STL(Standard Template Library...
这部分内容对于初学者而言是极为重要的,因为它涉及到了进程间通信的基础技术,如管道、套接字和命名管道等。通过这些基础知识的学习,读者不仅能够掌握网络通信的核心概念,而且还能为日后的网络编程工作打下坚实的...
1. **套接字(Sockets)编程**:套接字是网络通信的基础,它提供了一种进程间通信的方式。在Visual C++中,通过Winsock库来实现套接字编程。书中会详细介绍如何创建、连接、监听和接受套接字,以及发送和接收数据。 ...
3. 套接字编程:套接字是网络通信的基础,它是进程间通信的一种方式。在Visual C++中,我们使用`socket()`函数创建套接字,`bind()`函数绑定IP地址和端口,`listen()`函数启动监听,`accept()`函数接受连接请求,`...
第一部分 Visual C++ 2010开发与新特性 第1章 Visual C++ 2010开发环境简介 1 1.1 Visual C++ 2010简介 1 1.2 Visual C++ 2010下载安装指南 1 1.3 Visual C++ 2010主要特点与新特性 3 1.4 Visual C++ 2010开发环境...
- **C/C++编程基础**:这是实现进程间通信的基础,需要熟悉基本语法和数据结构。 - **操作系统基础知识**:理解进程的概念,以及内存管理和调度等基本原理。 - **同步与互斥原语**:如临界区、信号量、互斥量等,...