190716-1 .h #pragma once #include class CClientDCU : public CDC { HDC m_hDCu; HWND m_hWndu; public: CClientDCU(CWnd* pWnd); ~CClientDCU(); void Ellipse(int x1, int y1, int x2, int y2)const; }; .cpp #include "pch.h" #include "CClientDCU.h" CClientDCU::CClientDCU(CWnd* pWnd) { m_hWndu = pWnd->m_hWnd; m_hDCu = ::GetDC(m_hWndu); } CClientDCU::~CClientDCU() { ::ReleaseDC(m_hWndu, m_hDCu); } void CCli..
190715 매니패스트 형식메타데이터 CIL CODE [리소스] 닷넷은 독립적인 라이브러리(.net 프레임워크)를 사용한다. MFC : Windows os 의 바이너리만 만들 수 있다. 닷넷은 CLR만 있으면 다른 운영체제에서도 가능하다. 우리는 MFC를 공부해볼 것이다. MFC는 c++을 사용해서 윈도우즈 개발을하는데 라이브러리 이름이 MFC인 것이다. IL DASM 형식 데이터(?) (ctrl+m) MFC (90년대 초) (프레임워크 프로그래밍 공부하기 좋다.) - Afx 가 앞에 붙어있는 함수들은 전역함수다. AfxGetApp() : 주소를 반환하는데 CWinApp 객체의 주소를 반환한다. FrameWork 프로그래밍 : 이미 구조가 만들어져있고 그 위에서 하는 프로그래밍. (정형화) 먼저 구조를 ..
190712-4 - IOCP 모델 비동기 입출력을 쉽게 할 수 있는 객체를 만들었다. // 입출력 완료 포트 생성 HANDLE hcp = CreateIoCompletionPort( INVALID_HANDLE_VALUE, NULL, 0, 0);//- 첫 번째 인수가 -1이면 ICOP 오브젝트를 생성 if(hcp == NULL) return -1; // 소켓과 입출력 완료 포트 연결 HANDLE hResult = CreateIoCompletionPort((HANDLE)client_sock, hcp, (DWORD)client_sock, 0); // 첫 번째 인수가 IOCP인수를 가지면 IOCP와 해당 소켓을 연결한다. //키=소켓번호 로 설정, 0 = 스레드를 전부 깨운다. if(hResult == NULL)..
190712-3 Overlapped 모델 동기 : 비동기 : 완료보고를 받고 동작을 처리해야한다. 닷넷에가면 비동기 델리게이트로 구현되어있다. // 소켓 정보 저장을 위한 구조체 struct SOCKETINFO { WSAOVERLAPPED overlapped; SOCKET sock; char buf[BUFSIZE+1]; int recvbytes; int sendbytes; WSABUF wsabuf; // 전송할 데이터의 크기와 버퍼의 주소값이 포함되는 구조체 (WSAsend함수에필요) }; // 더미(dummy) 이벤트 객체 생성 WSAEVENT hEvent = WSACreateEvent(); if(hEvent == WSA_INVALID_EVENT) err_quit("WSACreateEvent()"); ..
190712-2 WSAEventSelect // WSAEventSelect() retval = WSAEventSelect(listen_sock, EventArray[nTotalSockets-1], FD_ACCEPT|FD_CLOSE); OS에 알려준다. 임의의 소켓을 대상으로 이벤트 발생여부를 관찰하도록 한다. // 이벤트 객체 관찰 index = WSAWaitForMultipleEvents(nTotalSockets, EventArray, FALSE, WSA_INFINITE, FALSE); 단 하나라도 이벤트 발생시 리턴한다.