//////////////////////////////////////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更新该数据项目; } |
相关推荐
多进程间通信通过剪贴板进行消息通信.rar
visual c++ MFC之Lesson17进程间通信
Visual C++ 进程与线程 相关源代码,涵盖终止当前进程,获取系统进程,终止指定进程,在程序中启动程序,使用事件对象同步进程,在两个执行程序间进行数据通信,使用工作线程,正常终止线程,异常终止进程,使用线程...
visual c++利用管道和线程实现进程间通信
visual c++ vc通过共享内存实现多进程间的通信,共享数据
第一部分 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开发环境...
第11章 实例257——使用Win32 API创建、销毁线程(控制进度条) 实例258——创建MFC用户界面线程 实例259——创建MFC工作者线程,进行耗时计算 实例260——设置线程的... 实例277——通过消息机制实现进程间的通信
9.3 通信实现思路 234 9.3.1 功能描述 234 9.3.2 通信事件的处理方法 235 9.3.3 各种操作状态的含义 235 9.4 界面设计 237 9.4.1 主界面设计 237 9.4.2 设置对话框设计 238 9.5 程序设计 239 9.5.1 变量/函数声明 ...
16.1.9 进程间通信的示例 632 16.4 命名管道通信 637 16.4.1 CreateNamedPipe()函数 637 16.4.2 ConnectNamedPipe()函数 639 16.4.3 DisconnectNamedPipe() 16.1.9 函数 640 16.4.4 WaitNamedPipe()函数 640 16.4.5 ...
实例052 在ListBox控件间实现数据交换 实例053 列表项的提示条 2.4 ComboBox控件典型实例 实例054 将数据表中的字段添加到ComboBox控件 实例055 带查询功能的ComboBox控件 实例056 自动调整组合框的宽度 实例...
注:第一卷的描述写错了,总共是三卷压缩包 Visual C++通用范例开发... 10.3 进程间通信 10.4 本章小结 第11章 动态链接库和ActiveX控件 11.1 动态链接库 11.2 ActiveX控件 11.3 本章小结 索引 参考文献
3.1 进程间通信 43 3.1.1 通信策略 43 3.1.2 同步和异步通信 44 3.2 窗口消息 44 3.2.1 打开和关闭 44 3.2.2 读与写 45 3.2.3 回顾 45 3.3 动态数据交换 46 3.3.1 客户/服务器 46 3.3.2 打开和关闭 46 3.3.3 读和写 ...
本书通过85个实例全面讲述了应用MFC进行Visual C++编程的思想。每个实例均以编写一个应用程序要走的步骤编写。全书共分四部分进行介绍,第一部分是基础知识,第二部分讲述用户界面的实例,第三部分讲述MFC内部处理...
Visual C++通用范例开发金典(附光盘)/开发专家 ... 10.3 进程间通信 10.4 本章小结 第11章 动态链接库和ActiveX控件 11.1 动态链接库 11.2 ActiveX控件 11.3 本章小结 索引 参考文献
注:分卷一的说明写错了,总共三卷压缩包 Visual C++通用范例开发... 10.3 进程间通信 10.4 本章小结 第11章 动态链接库和ActiveX控件 11.1 动态链接库 11.2 ActiveX控件 11.3 本章小结 索引 参考文献
181 如何在两个执行程序间进行数据通信? 182 如何使用工作线程? 183 如何正常终止线程? 184 如何异常终止线程? 185 如何获取线程退出码? 186 如何使用线程优先级? 187 如何使用用户界面线程? 188 如何实现多线程多...
来源 visual c++开发范例,IDE:vs2010. 分为 a.server(接收消息,显示接收到的数值). b.client(打开server进程,向server主窗体发送消息). //得到主窗口 HWND CMyJC006ClientDlg::GetServerMainWnd() { HWND hWnd; ...
13.4 例66 在数据类中实现串行化 229 13.5 例67 串行化SDI或MDI文档 235 13.6 例68 按要求串行化 240 13.7 例69 透明地更新串行化的文档 242 13.8 例70 串行化多态类 246 13.9 例71 串行化数据集 248 13.10 例72 ...