반응형
//server
#include<windows.h> #include<stdio.h> DWORD WINAPI foo( void *p) { HANDLE hPipe = CreateNamedPipe("\\\\.\\pipe\\source_server", //UNC PIPE_ACCESS_OUTBOUND, // 출력전용 PIPE_TYPE_BYTE, //stream방식 1, //최대 instance개숫 4096,4096, //최대 입출력 버퍼 크기 1000, //WaitNamedPipe()로 대기할 시간 0); //KO보안 if(hPipe == INVALID_HANDLE_VALUE) { printf("파이프를 생성할 수 없습니다.\n"); return 0; } //-------------------------------------------------------------------------- while(1) { BOOL b = ConnectNamedPipe(hPipe , 0 ); //Client의 접속을 대기한다. //이부분에서 클라이언트가 접속할때까지 Blocking if( b == FALSE && GetLastError() == ERROR_PIPE_CONNECTED) b = TRUE; if( b )//접속이 되었다면 { char buf[4096] = { 0 }; //아래의 영역은 클립보드에서 data를 꺼낸다. //=========================================================== if(OpenClipboard(0)) { HANDLE hData = GetClipboardData(CF_TEXT); char * p = (char *)GlobalLock(hData); strcpy(buf,p); GlobalUnlock(hData); CloseClipboard(); } //=========================================================== //Pipe에 쓰기 DWORD len; WriteFile(hPipe, buf, strlen(buf)+1, &len, 0); FlushFileBuffers(hPipe); DisconnectNamedPipe(hPipe); //강제로 접속을 끊는다. } } return 0; } void main() { HANDLE h1 = CreateThread(0,0,foo,0,0,0); WaitForSingleObject(h1,INFINITE); CloseHandle(h1); }
//client
#include<windows.h> #include<stdio.h> LRESULT CALLBACK WndProc(HWND hwnd,UINT iMessage,WPARAM wParam,LPARAM lParam); TCHAR lpszClass[] = TEXT("first"); int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrev, LPSTR lpCmdLine, int nShowCmd) { AllocConsole(); // 콘솔창 생성 freopen("CONOUT$", //콘솔을 "wt", //text write모드로 stdout); //stdoutrhk 연결 MSG Message; //1. 위도우 클래스 만들기 (10가지를 다 정확히 입력하지 않으면 화면이 뜨지 않는다.) WNDCLASS wc; //미리정의된 10개 항목을 채우는 클래스 (WNDCLASSEX 12개 항목 10개 항목에 작은 아이콘, 구조체 크기를 포함한다.) wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hbrBackground = (HBRUSH)GetStockObject( WHITE_BRUSH); wc.hCursor = LoadCursor ( 0, IDC_CROSS); wc.hIcon = LoadIcon ( 0, IDI_WINLOGO ); wc.hInstance = hInstance; wc.lpfnWndProc = WndProc; //<~ 이부분을 자신이 만드는 함수로 바꿔줘야 한다. 메시지 함수등록 wc.lpszClassName= lpszClass; wc.lpszMenuName = 0; wc.style = 0; //2. 윈도우 클래스 등록하기. RegisterClass( & wc ); // 등록을 하는 함수도 2가지가 있다. RegisterClass와 RegisterClassEx가 있다. //WNDCLASS로 만들었으면 RegisterClass로 등록하고 WNDCLASSEX로 만들었으면 RegisterClassEx로 등록 //3. 등록된 클래스를 사용해서 윈도우 만들기. // typedef long HWND; // 윈도우의 번호를 담을때 사용 HWND hwnd = CreateWindowEx(0 , // 확장 윈도우 스타일 lpszClass, // 윈도우 클래스 이름 TEXT("첫시작"), // 창이름 WS_OVERLAPPEDWINDOW, // 기본 Window Styles : & ~ 연산으로 기존스타일 제거하기 // WS_OVERLAPPEDWINDOW & ~WS_MAXIMIZEBOX 20, 20, 839, 660, // X,Y,W,H 0, // 부모 윈도우 핸들( 번호 ) 0, // 메뉴 핸들( 번호 ) hInstance, // 인스턴스 핸들 0); // 생성인자.( MDI 만들때 사용 ) //4. 윈도우 보여주기 ShowWindow(hwnd, nShowCmd); while(GetMessage(&Message,0,0,0)) //메시지 큐에 가서 메시지를 꺼내오고 가져온 메시지를 윈도우 클래스에 등록된 메세지 처리함수로 전달한다. { //여기서 메시지를 처리하면 부모뿐 아니라 모든 자식윈도우로 전달되는 메시지도 먼저 처리할 수 있다. TranslateMessage(&Message); if (Message.message == WM_SYSKEYDOWN && Message.wParam == 'X') { PostQuitMessage(0); MessageBox(hwnd, "종료","질문",MB_OK); //SendMessage(hwnd, WM_CLOSE,0,0); continue; } //PreTranslateMessae(&Message); DispatchMessage(&Message);//가져온 메시지를 윈도우 클래스에 등록된 메시지 처리함수로 전달한다. } //MessageBox(0, "이제 알겠죠?","물음",MB_OKCANCEL);//종료되지 않게 하기 위해 return 0; } LRESULT CALLBACK WndProc(HWND hwnd,UINT iMessage,WPARAM wParam,LPARAM lParam) { static HWND hEdit, hIP, hBtn; switch(iMessage){ case WM_DESTROY: PostQuitMessage(0); return 0 ; case WM_CREATE: hIP = CreateWindow("edit","", WS_CHILD | WS_VISIBLE | WS_BORDER | ES_MULTILINE, 10,10,100,30,hwnd,(HMENU)1,0,0); hBtn = CreateWindow("button","Connect", WS_CHILD | WS_VISIBLE | WS_BORDER, 120,10,170,30,hwnd,(HMENU)2,0,0); hEdit = CreateWindow("edit","", WS_CHILD | WS_VISIBLE | WS_BORDER | ES_MULTILINE, 10,50,500,500,hwnd,(HMENU)3,0,0); return 0 ; //버튼을 누를때 Pipe서버에 접속한다. case WM_COMMAND: { switch(LOWORD(wParam)) { case 2: { //결국 Pipe는 파일처럼 사용하면 된다. char name[256] = "\\\\"; char ip[256]; GetWindowText(hIP,ip,256); strcat(name, ip); strcat(name, "\\pipe\\source_server"); HANDLE hPipe = CreateFile(name, GENERIC_READ, FILE_SHARE_WRITE | FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); if(hPipe == INVALID_HANDLE_VALUE) { MessageBox(0, "실패" , "" ,MB_OK); return 0; } char buf[4096] = {0}; DWORD len; ReadFile(hPipe, buf, 4096, &len, 0); CloseHandle(hPipe); SetWindowText(hEdit, buf); } } } return 0; } //꺼내온 메시지를 처리하지 않은경우 -> 바드시 아래 함수를 처리한다. return(DefWindowProc(hwnd,iMessage,wParam,lParam)); }
반응형
"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."