`
isiqi
  • 浏览: 16586834 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

Visual C++进程间数据通信的实现

阅读更多

Visual C++进程间数据通信的实现

2006-01-19 08:43 作者: 刘涛 出处: 天极开发 责任编辑:方舟
  在Windows系统中,各个应用程序(进程)之间常常需要交换、传递数据,这就要解决进程间的数据通信问题。在最初的16位Windows3.x系统中,所有Windows应用程序共享单一地址,任何进程都能够对这一共享地址空间的数据进行读写操作。随着Windwos98、WindowsNT、Windows2000等32位的操作系统的出现,规定每个进程都有自己的地址空间,一个Windows进程不能存取另一个进程的私有数据,也就是说,虽然两个进程可以用具有相同值的指针寻址,但所读写的只是它们各自的数据,这样就减少了进程之间的相互干扰。那么上述技术的采用是否意味着各个应用程序之间不能进行数据交换了呢?答案当然是否定的,强大的Windows系统早已为我们设计了很多方案来解决进行间的通信问题,这里我们只探讨如何通过动态数据交换(DDE)方法实现进程间的数据通信。

  本实例程序功能如下,服务器端有两个数据项,一个是输入的字符串,另一个是定时增加的整数。运行该程序的两个实例后,两个程序就可以建立DDE连接,实现数据的传递,并将另外一个实例传送过来的数据显示出来。下图为程序编译运行后的效果图:


图一、DDE方法实现进程间数据通信程序的界面效果图

  一、实现方法

  自从微软推出Windows操作系统以来,动态数据交换(DDE)就已经成为Windows的部分,并且很多Windwos应用程序都使用了DDE技术来实现进程之间的数据交换。DDE是建立在Windows内部消息系统、全局和共享全局内存基础上的一种协议,用来协调Windows应用程序之间的数据交换和命令调用,它已经成为应用程序之间通信的一种常用方法。

  DDE应用程序可以分为四种类型:客户类型、服务器类型、客户/服务器类型和监视器。DDE会话发生在客户应用程序和服务器应用程序之间。客户应用程序从服务器应用程序请求数据或服务,服务器应用程序响应客户应用程序的数据或服务请求。客户/服务器应用程序是既可以发出请求,又可以提供信息,监视器应用程序则是用语调试的目的。

  DDE协议使用三级树型命名:服务(SERVICE)、主题(TOPIC)和数据项(ITEM)来标识DDE所要传送的数据单元。服务使应用程序具有了提供给其他程序的数据交换能力;主题类似于目录,是建立会话连接的参数:ITEM才是DDE具体通信时要传送的数据内容,比如一个数据或一个字符串。

  动态交换管理库(DDEML)提供了DDE和应用程序级协议。使用DDEML开发的应用程序无论是在运行一致性方面还是在应用程序相互通信方面性能均优于没有使用DDEML的应用程序。而且DDEML的应用使得开发支持DDE的应用程序容易了许多。

  建立DDE会话后,客户程序和服务器程序可以通过三种链接方式进行数据交换,分别是:1、冷链接:客户程序申请数据,服务器程序立即给客户程序发送数据;2、温链接:服务器程序通知客户程序数据数据项发生了改变,但是并没有将已发生的值发送给客户程序。3、热链接:当数据项发生变化时,服务器程序立即把变化后的值发送给客户程序,这是最常用、最方便的方法,下面的例子就使用的这种方法。

  DDE会话初始化

  使用API函数DdeInitialize(),在DDEML中注册应用。

  会话建立

  服务器:注册服务DdeNameService.

  客户:连接DdeConnect.

  会话过程

  类似于Windows的消息循环,会话的过程就是事务处理的过程。客户通过DdeClientTransaction()来发出事务请求,通过DDE回调函数,服务器处理客户事务请求,返回DdeCreateDataHandle来发送数据,同时客户可以调用DdeGetData()获取数据。

  会话结束

  可由服务方或客户方来终止会话,推出程序时要注消服务,释放资源,调用DdeUninitialize()。

  二、编程步骤

  1、启动Visual C++6.0,新建一个基于对话框的MFC应用程序,取名为DDEdemo,添加两个Group Box控件并分别在其上放置编辑控件IDC_EDIT、静态控件ID_STATIC1、ID_STATIC2、 ID_STATIC3,用Wizard添加对应成员变m_edit(CString类型),添加并将其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[]="Topic";//Server DDE目录名;
const char *pszItem[NITEM]={"Item1","Item2"};//SERVER ITEM名称字符串数组;
int count=0;//记数,在Static1中显示;
CString ServerData[NITEM];//存放服务器中的数据项内容;
HCONV hConv=0; //会话句柄;
DWORD idlnst=0; //DDEML实例句柄;
HWND hWnd; //窗口句柄;
HANDLE hlnst; //实例句柄;
HSZ hszApp=0; //SERVER服务字符串句柄;
HSZ hszTopic=0; //SERVER目录字符串句柄;
HSZ hszItem[NITEM]; //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 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提供了很多方法来实现进程之间的通信,相互传递数据,如通过系统剪贴板方法、共享DLL方法、管道方法等,这些方法的存在保证了程序的健壮性和鲁棒性(稳定性),有兴趣的读者可以自行参考有关资料。
三、程序代码

//////////////////////////////////////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提供了很多方法来实现进程之间的通信,相互传递数据,如通过系统剪贴板方法、共享DLL方法、管道方法等,这些方法的存在保证了程序的健壮性和鲁棒性(稳定性),有兴趣的读者可以自行参考有关资料。

分享到:
评论

相关推荐

    进程间通过剪贴板进行消息通信.visual c++

    本教程将详细讲解如何利用Windows操作系统中的剪贴板功能实现进程间通信,以Visual C++作为开发环境。剪贴板作为一种共享内存区域,可以为多个进程提供一个安全、便捷的信息传递渠道。 首先,我们需要了解什么是...

    Visual.C++.网络通信编程实用案例精选 光盘源码

    套接字是网络通信的基础,它提供了进程间通信的能力,允许数据在网络中传输。读者会学习到如何创建、绑定、监听和接受连接等基本操作。 2. **TCP/IP协议**:TCP(传输控制协议)和IP(网际协议)是互联网通信的核心...

    VC利用管道和多线程实现进程间通信

    VC++环境下利用管道和线程实现进程间通信的技术是指在Windows操作系统中,使用Visual C++语言,通过创建管道和线程来实现进程之间的通信。这种技术可以在不同的进程之间实现信息交换,达到协作的效果。 进程间通信...

    Visual C++实现进程的创建

    3. 进程间通信:如果新进程需要与父进程通信,可以使用管道、内存映射文件或消息队列等机制。 4. 错误处理:务必检查函数调用返回值,并对可能出现的错误进行处理。 在Visual C++环境中,还可以利用MFC(Microsoft ...

    visual c++ MFC之Lesson17进程间通信

    visual c++ MFC之Lesson17进程间通信

    Visual C++实现命名管道的通信

    命名管道是Windows操作系统中一种进程间通信(IPC)机制,它允许不同的进程之间进行数据交换。在本文中,我们将深入探讨如何使用Visual C++来实现命名管道的通信,这是一种简单而有效的技术,尤其适用于在同一台...

    两个进程间的消息通信

    在Windows操作系统中,VC++(Visual C++)提供了多种实现进程间通信的机制,包括管道、共享内存、套接字、消息队列等。本主题将主要讨论在VC++环境下,通过MFC(Microsoft Foundation Classes)库实现两个进程间的...

    通过共享内存实现多进程间的通信,共享数据

    在Windows系统中,Visual C++(VC++)提供了多种方式来实现进程间的通信,其中之一就是共享内存。共享内存允许不同进程访问同一块内存区域,从而实现数据的共享。下面我们将深入探讨如何使用VC++通过共享内存进行多...

    Visual C++网络通信代码.rar

    1. **套接字(Sockets)**:套接字是网络通信的基础,它提供了进程间通信的接口,使得运行在不同计算机上的程序能够相互通信。在Visual C++中,可以使用Winsock库来操作套接字。 2. **TCP/IP协议**:传输控制协议/...

    VC++实现两个进程间的通信--DLL

    - 进程间通信是不同进程之间交换数据或协调工作的方式。Windows提供了多种IPC机制,如管道、消息队列、共享内存、套接字、命名管道、事件、信号量等。 - 在这个示例中,DLL作为通信的媒介,可能使用了消息队列、...

    通过消息机制实现进程间的通信(VC++)

    在Windows操作系统中,通过消息机制实现进程间的通信是一种常见的方法,尤其是在使用Visual C++(VC++)进行开发时。本文将深入探讨如何使用VC++中的消息系统来实现实现进程间的通信。 首先,我们要理解Windows的...

    Visual C++ 进程与线程

    Visual C++ 进程与线程 相关源代码,涵盖终止当前进程,获取系统进程,终止指定进程,在程序中启动程序,使用事件对象同步进程,在两个执行程序间进行数据通信,使用工作线程,正常终止线程,异常终止进程,使用线程...

    Visual+C++网络通信编程实用案例精选》配套源码

    1. **套接字(Sockets)**:套接字是网络通信的基础,是进程间通信的一种方式。在C++中,可以使用Winsock库或POSIX套接字API来创建和管理套接字。套接字分为流式(TCP)和数据报(UDP)两种类型,分别对应面向连接和...

    vc实现进程间通信

    ### Visual C++ 实现进程间通信详解 #### 进程间通信的重要性与背景 在Windows系统环境下,进程间通信(IPC)是多个独立运行的进程能够互相协作、共享信息的关键技术。随着操作系统的演进,从早期的16位Windows 3....

    Programming Microsoft Visual C++ Fifth Edition 代码

    5. **Windows API**:掌握如何直接调用Windows API来实现底层功能,如文件操作、进程间通信等。 6. **异常处理**:理解C++的异常处理机制,以及如何编写健壮的异常安全代码。 7. **STL(Standard Template Library...

    visual c++网络通信编程实用案例精选 四维科技 曹衍龙、刘海英编

    这部分内容对于初学者而言是极为重要的,因为它涉及到了进程间通信的基础技术,如管道、套接字和命名管道等。通过这些基础知识的学习,读者不仅能够掌握网络通信的核心概念,而且还能为日后的网络编程工作打下坚实的...

    Visual C++网络程序设计实例详解pdf+源代码

    1. **套接字(Sockets)编程**:套接字是网络通信的基础,它提供了一种进程间通信的方式。在Visual C++中,通过Winsock库来实现套接字编程。书中会详细介绍如何创建、连接、监听和接受套接字,以及发送和接收数据。 ...

    《Visual C++网络通信编程实用案例精选》配套源码

    3. 套接字编程:套接字是网络通信的基础,它是进程间通信的一种方式。在Visual C++中,我们使用`socket()`函数创建套接字,`bind()`函数绑定IP地址和端口,`listen()`函数启动监听,`accept()`函数接受连接请求,`...

    Visual C++2010开发权威指南(共三部分).part1.rar

    第一部分 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++编程基础**:这是实现进程间通信的基础,需要熟悉基本语法和数据结构。 - **操作系统基础知识**:理解进程的概念,以及内存管理和调度等基本原理。 - **同步与互斥原语**:如临界区、信号量、互斥量等,...

Global site tag (gtag.js) - Google Analytics