[乱]mfc与sdk笔记[十三]

进程间通信。剪贴板,管道,邮槽

  1. 剪贴板
    1. OpenClipboard();//打开剪贴板,别人将不能使用剪贴板。
    2. CloseClipboard();//关闭剪贴板
    3. GetClipboardData(CF_TEXT);//获得剪贴板数据
    4. EmptyClipboard();//清空剪贴板,释放剪贴板中的数据句柄,当前窗口成为剪贴板拥有者
    5. SetClipboardData();//在剪贴板上放置数据
    6. hClip=GlobalAlloc(GMEM_MOVEABLE,str.GetLength()+1); //全局内存,返回指针
    7. pBuf=(char*)GlobalLock(hClip);//全局内存加锁返回指针
    8. GlobalUnlock(); //全局内存解锁
    1. if(OpenClipboard())
    2.     {
    3.         CString str;
    4.         HANDLE hClip
    5.         char *pBuf;
    6.         EmptyClipboard();
    7.         GetDlgItemText(IDC_EDIT_SEND,str);
    8.         hClip=GlobalAlloc(GMEM_MOVEABLE,str.GetLength()+1);     //分配一块全局内存
    9.         pBuf=(char*)GlobalLock(hClip)//对这块内存区域加锁
    10.         strcpy(pBuf,str);    //把数据加入到这块区域
    11.         GlobalUnlock(hClip); //区域解锁
    12.         SetClipboardData(CF_TEXT,hClip); //这块内存加载到剪贴板
    13.         CloseClipboard();    //关闭剪贴板
    14.     }
    15.         //接受
    16.         if(OpenClipboard())
    17.     {
    18.         if(IsClipboardFormatAvailable(CF_TEXT))
    19.         {
    20.             HANDLE hClip;
    21.             char *pBuf;
    22.             hClip=GetClipboardData(CF_TEXT);//从剪贴板中获取指定格式数据的内存对象句柄
    23.             pBuf=(char*)GlobalLock(hClip);//句柄转换
    24.             GlobalUnlock(hClip);//解锁
    25.             SetDlgItemText(IDC_EDIT_RECV,pBuf);
    26.             CloseClipboard();
    27.         }
    28.     }
  2. 匿名管道,他们只能父子进程之间通讯
    1. HANDLE hRead;
    2. HANDLE hWrite;
    3. SECURITY_ATTRIBUTES sa;
    4. sa.bInheritHandle = TRUE;
    5. sa.lpSecurityDescriptor = NULL;
    6. sa.nLength = sizeof(SECURITY_ATTRIBUTES);
    7. if(!CreatePipe(&hRead,&hWrite,NULL,))//创建一个匿名管道,返回管道读写句柄
    8. {
    9.         MessageBox("Create pipe fail!");
    10.         return ;
    11. }
    12. //============================
    13.     STARTUPINFO sui;     //打开窗口的信息
    14.     PROCESS_INFORMATION pi;     //进程信息
    15.     ZeroMemory(&sui,sizeof(STARTUPINFO)); //把内存结构设为0
    16.     sui.cb=sizeof(STARTUPINFO);     //大小
    17.     sui.dwFlags=STARTF_USESTDHANDLES//设置标记
    18.     sui.hStdInput=hRead;    //标准输入句柄,设为继承的管道句柄
    19.     sui.hStdOutput=hWrite;     //标准输出句柄,设为继承的管道句柄
    20.     sui.hStdError=GetStdHandle(STD_ERROR_HANDLE);    //得到父亲的标准错误句柄
    21.    
    22.     if(!CreateProcess("..\\Child\\Debug\\Child.exe",NULL,NULL,NULL,
    23.             TRUE,0,NULL,NULL,&sui,&pi))
    24.     {
    25.         CloseHandle(hRead);     //关闭管道读取句柄
    26.         CloseHandle(hWrite);     //关闭管道写入句柄
    27.         hRead=NULL;
    28.         hWrite=NULL;
    29.         MessageBox("创建子进程失败!");
    30.         return;
    31.     }
    32.     else
    33.     {
    34.         CloseHandle(pi.hProcess); //子进程的句柄,使用技术-1
    35.         CloseHandle(pi.hThread)//子进程线程内核对象,使用技术-1
    36.         //不使用内核对象的时候要关闭句柄
    37.     }
    38.  
    39.  
    40.     //===========子进程=================
    41.     char buf[100];
    42.     DWORD dwRead;
    43.     if(!ReadFile(hRead,buf,100,&dwRead,NULL))
    44.     {
    45.         MessageBox("读取数据失败!");
    46.         return;
    47.     }
    48.     MessageBox(buf);
    49.  
    50.     // =======写入句柄=========
    51.     char buf[]="匿名管道测试程序";
    52.     DWORD dwWrite;
    53.     if(!WriteFile(hWrite,buf,strlen(buf)+1,&dwWrite,NULL))
    54.     {
    55.         MessageBox("写入数据失败!");
    56.         return;
  3. 命名管道
    1. //=======服务端=======
    2. //创建
    3.  HANDLE hPipe;
    4.     hPipe=CreateNamedPipe("\\\\.\\pipe\\MyPipe",
    5.         PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED,
    6.         0,1,1024,1024,0,NULL);
    7.     if(INVALID_HANDLE_VALUE==hPipe)
    8.     {
    9.         MessageBox("创建命名管道失败!");
    10.         hPipe=NULL;
    11.         return;
    12.     }
    13.     HANDLE hEvent;
    14.     hEvent=CreateEvent(NULL,TRUE,FALSE,NULL); //人工重置的事件对象
    15.     if(!hEvent)
    16.     {
    17.         MessageBox("创建事件对象失败!");
    18.         CloseHandle(hPipe);
    19.         hPipe=NULL;
    20.         return;
    21.     }
    22.     OVERLAPPED ovlap;
    23.     ZeroMemory(&ovlap,sizeof(OVERLAPPED));
    24.     ovlap.hEvent=hEvent;
    25.     if(!ConnectNamedPipe(hPipe,&ovlap))    //允许一个服务进程等待一个客户端进程链接一个命名管道实例上
    26.     {
    27.         if(ERROR_IO_PENDING!=GetLastError())
    28.         {
    29.             MessageBox("等待客户端连接失败!");
    30.             CloseHandle(hPipe);
    31.             CloseHandle(hEvent);
    32.             hPipe=NULL;
    33.             return;
    34.         }
    35.     }
    36.     if(WAIT_FAILED==WaitForSingleObject(hEvent,INFINITE))
    37.     {
    38.         MessageBox("等待对象失败!");
    39.         CloseHandle(hPipe);
    40.         CloseHandle(hEvent);
    41.         hPipe=NULL;
    42.         return;
    43.     }
    44.     CloseHandle(hEvent);
    45. //写入
    46.     char buf[]="abc";
    47.     DWORD dwWrite;
    48.     if(!WriteFile(hPipe,buf,strlen(buf)+1,&dwWrite,NULL))
    49.     {
    50.         MessageBox("写入数据失败!");
    51.         return;
    52.     }
    53.     //读取
    54.         char buf[100];
    55.     DWORD dwRead;
    56.     if(!ReadFile(hPipe,buf,100,&dwRead,NULL))
    57.     {
    58.         MessageBox("读取数据失败!");
    59.         return;
    60.     }
    61.     MessageBox(buf);
    62.  
    63.     //客户端
    64.     if(!WaitNamedPipe("\\\\.\\pipe\\MyPipe",NMPWAIT_WAIT_FOREVER)) //链接命名管道
    65.     {
    66.         MessageBox("当前没有可利用的命名管道实例!");
    67.         return;
    68.     }
    69.     hPipe=CreateFile("\\\\.\\pipe\\MyPipe",GENERIC_READ | GENERIC_WRITE,
    70.         0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
    71.     if(INVALID_HANDLE_VALUE==hPipe)
    72.     {
    73.         MessageBox("打开命名管道失败!");
    74.         hPipe=NULL;
    75.         return;
    76.     }
    77.  
    78. //读取
    79.     char buf[100];
    80.     DWORD dwRead;
    81.     if(!ReadFile(hPipe,buf,100,&dwRead,NULL))
    82.     {
    83.         MessageBox("读取数据失败!");
    84.         return;
    85.     }
    86.     MessageBox(buf);
    87.  
    88.     // 写入
    89.     char buf[]="命名管道测试程序";
    90.     DWORD dwWrite;
    91.     if(!WriteFile(hPipe,buf,strlen(buf)+1,&dwWrite,NULL))
    92.     {
    93.         MessageBox("写入数据失败!");
    94.         return;
    95.     }
  4. 邮槽. 采用udp传输的
    1. //=====接收=====
    2.     HANDLE hMailslot;
    3.     hMailslot=CreateMailslot("\\\\.\\mailslot\\MyMailslot",0,
    4.         MAILSLOT_WAIT_FOREVER,NULL); //一直等待直到有消息的邮槽
    5.     if(INVALID_HANDLE_VALUE==hMailslot)
    6.     {
    7.         MessageBox("创建油槽失败!");
    8.         return;
    9.     }
    10.     char buf[100];
    11.     DWORD dwRead;
    12.     if(!ReadFile(hMailslot,buf,100,&dwRead,NULL))
    13.     {
    14.         MessageBox("读取数据失败!");
    15.         CloseHandle(hMailslot);
    16.         return;
    17.     }
    18.     MessageBox(buf);
    19.     CloseHandle(hMailslot);
    20.  
    21.     //=====发送=====
    22.         HANDLE hMailslot;
    23.     hMailslot=CreateFile("\\\\.\\mailslot\\MyMailslot",GENERIC_WRITE,
    24.         FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
    25.     if(INVALID_HANDLE_VALUE==hMailslot)
    26.     {
    27.         MessageBox("打开油槽失败!");
    28.         return;
    29.     }
    30.     char buf[]="abcd";
    31.     DWORD dwWrite;
    32.     if(!WriteFile(hMailslot,buf,strlen(buf)+1,&dwWrite,NULL))
    33.     {
    34.         MessageBox("写入数据失败!");
    35.         CloseHandle(hMailslot);
    36.         return;
    37.     }
    38.     CloseHandle(hMailslot);

Tags: ,

在 “[乱]mfc与sdk笔记[十三]”居然有1个评论

  1. hss Says:

    在两台机子上用命名管道你用过吗?

打开了评论功能,但是需要被审核,所以请耐心等待。