64,662
社区成员
发帖
与我相关
我的任务
分享
//客户端
#include <stdio.h>
#include <windows.h>
#include <shlwapi.h>
#include "resource.h"
#pragma comment(lib,"shlwapi.lib")
HANDLE hPipe=NULL;
BOOL CALLBACK DialogProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR pCmdLine, int iCmdShow)
{
return DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, DialogProc);
}
BOOL CALLBACK DialogProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
static HWND hand;//主窗口的句柄;
static HWND hEdit1,hEdit2;
static BOOL bConnect = FALSE;
TCHAR tips[1024];
TCHAR words2[1024]=TEXT("CLT:\r\n");
TCHAR words[1024];
DWORD bytewrite;
int iStart,iEnd;
switch (message)
{
case WM_COMMAND:
switch(LOWORD(wParam))
{
case IDC_SEND:
GetDlgItemText(hand,IDC_EDIT2,words,1024);
StrCat(words2,words);
StrCat(words2,TEXT("\r\n"));
SendMessage (hEdit1, EM_GETSEL, (WPARAM) &iStart,(LPARAM) &iEnd);//获得显示框文本的结束位置;
SendMessage (hEdit1, EM_SETSEL, iEnd, iEnd); //选择显示文本的结束位置;
SendMessage (hEdit1, EM_REPLACESEL, 0, (LPARAM)words2); //向显示框中添加新输入的文本;
if(bConnect)
{
if (0==WriteFile(hPipe,words2,lstrlen(words2)+2,&bytewrite,NULL))
{
wsprintf(tips,TEXT("写入管道数据失败!错误代码(%d)"),GetLastError());
SetDlgItemText(hand,IDC_TIP,tips);
words[0]=TEXT('\0');
SetDlgItemText(hand,IDC_EDIT2,words);//清空编辑框;
return FALSE;
}
}
words[0]=TEXT('\0');
SetDlgItemText(hand,IDC_EDIT2,words);//清空编辑框;
wsprintf(tips,TEXT("写入管道数据成功"));
SetDlgItemText(hand,IDC_TIP,tips);
return TRUE;
case IDC_RECEIVE:
if (!ReadFile(hPipe,words,1024,&bytewrite,NULL))
{
wsprintf(tips,TEXT("读取管道数据失败!错误代码:(%d)"),GetLastError());
SetDlgItemText(hand,IDC_TIP,tips);
return FALSE;
}
SendMessage (hEdit1, EM_GETSEL, (WPARAM) &iStart,(LPARAM) &iEnd);//获得显示框文本的结束位置;
SendMessage (hEdit1, EM_SETSEL, iEnd, iEnd); //选择显示文本的结束位置;
SendMessage (hEdit1, EM_REPLACESEL, 0, (LPARAM)words); //向显示框中添加新输入的文本;
return TRUE;
case IDC_CONNECT:
if (!WaitForSingleObject(TEXT("\\\\ChaoV-PC\\pipe\\MyPipe"),NMPWAIT_WAIT_FOREVER))
{
wsprintf(tips,TEXT("当前没有可以用的管道实例!"));
SetDlgItemText(hand,IDC_TIP,tips);
return FALSE;
}
wsprintf(tips,TEXT("等到了可以用的管道实例!"));
SetDlgItemText(hand,IDC_TIP,tips);
hPipe = CreateFile(TEXT("\\\\ChaoV-PC\\pipe\\MyPipe"),GENERIC_READ|GENERIC_WRITE,0,
NULL,OPEN_EXISTING,0,NULL);
if (INVALID_HANDLE_VALUE==hPipe)
{
wsprintf(tips,TEXT("打开命名管道失败!错误代码:(%d)"),GetLastError());
SetDlgItemText(hand,IDC_TIP,tips);
hPipe = NULL;
return FALSE;
}
wsprintf(tips,TEXT("命名管道打开成功!"));
SetDlgItemText(hand,IDC_TIP,tips);
bConnect = TRUE;
return TRUE;
default:
return FALSE;
}
case WM_INITDIALOG:
hand = hwnd;
hEdit1 = GetDlgItem(hwnd,IDC_EDIT1);
hEdit2 = GetDlgItem(hwnd,IDC_EDIT2);
return TRUE;
case WM_CLOSE:
if (hPipe)
{
//CloseHandle(hPipe);
}
EndDialog(hwnd, 0);
return FALSE;
default:
return FALSE;
}
}
//服务端
#include <stdio.h>
#include <windows.h>
#include <shlwapi.h>
#include <process.h>
#include "resource.h"
#pragma comment(lib,"shlwapi.lib")
typedef struct
{
HWND hand;
HWND hEdit1;
}Data;
HANDLE hPipe=NULL;
BOOL CALLBACK DialogProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR pCmdLine, int iCmdShow)
{
return DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, DialogProc);
}
VOID ReceiveThread(PVOID pvoid)
{
TCHAR tips[50];
TCHAR words[1024];
DWORD byteread,iStart,iEnd;
Data*pDdata= (Data*)pvoid;
while (TRUE)
{
if (!ReadFile(hPipe,words,1024,&byteread,NULL))
{
wsprintf(tips,TEXT("读取管道数据失败!错误代码:(%d)"),GetLastError());
SetDlgItemText(pDdata->hand,IDC_TIP,tips);
//MessageBox(NULL,tips,TEXT("m"),MB_OK);
return;
}
SendMessage (pDdata->hEdit1, EM_GETSEL, (WPARAM) &iStart,(LPARAM) &iEnd);//获得显示框文本的结束位置;
SendMessage (pDdata->hEdit1, EM_SETSEL, iEnd, iEnd); //选择显示文本的结束位置;
SendMessage (pDdata->hEdit1, EM_REPLACESEL, 0, (LPARAM)words); //向显示框中添加新输入的文本;
}
/* wsprintf(tips,TEXT("error!错误代码(%d)"),GetLastError());
MessageBox(NULL,tips,TEXT("MESSGAE!"),MB_OK);
*/
}
BOOL CALLBACK DialogProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
static HWND hand;//主窗口的句柄;
static HWND hEdit1,hEdit2;
HANDLE hEvent;
OVERLAPPED ovlap;
static BOOL bConnect = FALSE;
TCHAR tips[1024];
TCHAR words2[1024]=TEXT("SRV:\r\n");
static TCHAR words[1024];
DWORD bytewrite;
static Data data;
int iStart,iEnd;
switch (message)
{
case WM_COMMAND:
switch(LOWORD(wParam))
{
case IDC_SEND:
GetDlgItemText(hand,IDC_EDIT2,words,1024);
StrCat(words2,words);
StrCat(words2,TEXT("\r\n"));
SendMessage (hEdit1, EM_GETSEL, (WPARAM) &iStart,(LPARAM) &iEnd);//获得显示框文本的结束位置;
SendMessage (hEdit1, EM_SETSEL, iEnd, iEnd); //选择显示文本的结束位置;
SendMessage (hEdit1, EM_REPLACESEL, 0, (LPARAM)words2); //向显示框中添加新输入的文本;
if(bConnect)
{
if (!WriteFile(hPipe,words2,lstrlen(words2)+2,&bytewrite,NULL))
{
wsprintf(tips,TEXT("写入管道数据失败!错误代码(%d)"),GetLastError());
SetDlgItemText(hand,IDC_TIP,tips);
}
}
words[0]=TEXT('\0');
SetDlgItemText(hand,IDC_EDIT2,words);//清空编辑框;
SetDlgItemText(hand,IDC_TIP,TEXT("写入管道数据成功!"));
return TRUE;
case IDC_CONNECT:
hEvent = CreateEvent(NULL,TRUE,FALSE,NULL);
if (!hEvent)
{
wsprintf(tips,TEXT("创建事件对象失败!错误代码(%d)"),GetLastError());
SetDlgItemText(hand,IDC_TIP,tips);
CloseHandle(hPipe);
hPipe = NULL;
return FALSE;
}
SetDlgItemText(hand,IDC_TIP,TEXT("创建事件对象成功!正在连接..."));
ZeroMemory(&ovlap,sizeof(OVERLAPPED));
ovlap.hEvent = hEvent;
if (!ConnectNamedPipe(hPipe,&ovlap))
{
if (ERROR_IO_PENDING!=GetLastError())
{
wsprintf(tips,TEXT("等待客户连接失败!错误代码(%d)"),GetLastError());
SetDlgItemText(hand,IDC_TIP,tips);
CloseHandle(hPipe);
CloseHandle(hEvent);
hPipe = NULL;
return FALSE;
}
SetDlgItemText(hand,IDC_TIP,TEXT("连接成功!正在等待对象"));
}
SetDlgItemText(hand,IDC_TIP,TEXT("连接成功!正在等待对象"));
if (WAIT_FAILED==WaitForSingleObject(hEvent,INFINITE))
{
wsprintf(tips,TEXT("等待对象失败!错误代码(%d)"),GetLastError());
SetDlgItemText(hand,IDC_TIP,tips);
CloseHandle(hPipe);
CloseHandle(hEvent);
hPipe = NULL;
return FALSE;
}
SetDlgItemText(hand,IDC_TIP,TEXT("等待对象成功!"));
bConnect = TRUE;
CloseHandle(hEvent);
data.hand = hand;
data.hEdit1 = hEdit1;
_beginthread(ReceiveThread,0,(PVOID)&data);
return TRUE;
}
return TRUE;
case WM_INITDIALOG:
hand = hwnd;
hEdit1 = GetDlgItem(hwnd,IDC_EDIT1);
hEdit2 = GetDlgItem(hwnd,IDC_EDIT2);
hPipe = CreateNamedPipe(TEXT("\\\\.\\pipe\\MyPipe"),PIPE_ACCESS_DUPLEX|FILE_FLAG_OVERLAPPED,
0,1,1024,1024,0,NULL);
if (INVALID_HANDLE_VALUE==hPipe)
{
wsprintf(tips,TEXT("创建命名管道失败!错误代码(%d)"),GetLastError());
SetDlgItemText(hand,IDC_TIP,tips);
hPipe = NULL;
return FALSE;
}
SetDlgItemText(hand,IDC_TIP,TEXT("创建命名管道成功,未连接!"));
bConnect =TRUE;
return TRUE;
case WM_CLOSE:
if (hPipe)
{
CloseHandle(hPipe);
}
EndDialog(hwnd, 0);
return FALSE;
default:
return FALSE;
}
}