프로그래밍 - Windows/MFC

CListCtrl에서 전체 선택하도록 하는 법


Report형식으로 된 CListCtrl 컨트롤을 기본 사용할 때의 팁.

기본세팅은 마우스 버튼을 클릭하면 맨 처음 열의 원소만 선택되지만,

아래와 같이 사용하는 Dialog에서 초기화 시켜줄 경우 전체 선택이 된다.

DWORD style = LVS_EX_FULLROWSELECT;
m_list.SendMessage(LVM_SETEXTENDEDLISTVIEWSTYLE, 0, LPARAM(style));


top

프로그래밍 - Windows/MFC

MFC의 CAsyncSocket 대용 소켓.


며칠전에 발생했던 듀얼 씨피유에서 발생되던 패킷 에러 문제를 해결하기 위해 Winsock2 API를 사용하기로 했으나, 바꿔야할 소스의 양이 상당히 많다는 걸 깨달았다. 다행히도 문제가 된 프로그램은 구조적으로 CSocket를 상속한 클래스였기 때문에 , CSocket (정확히는 CAsyncSocket)을 대체하는 클래스를 만들어 해결했다.
앞으로 클라이언트 소켓 짤때 종종써야지~


사용법 :
1. stdafx.h에 아래의 코드를 추가한다.

#include <winsock2.h>
#pragma comment(lib, "Ws2_32.lib")

2. 초기화 부분에
 CString tmp = _T("");
 WSADATA WsaData;
 if(::WSAStartup(MAKEWORD(2, 2), &WsaData))
 {
  tmp.Format("윈속을 초기화 하는데 실패했습니다. [ERROR CODE:%d]",
              ::WSAGetLastError());
  AfxMessageBox(tmp);
  return FALSE;
 }
를 추가한다.

3. CSocket을 상속받아 썼던 소켓클래스를 다음과 같이 변경했다.
class CDataSocket : public CSocket
->  class CDataSocket : public CAsyncSocketBase

동작 원리 : 별도의 Thread를 생성하여 WSAWaitForMultipleEvents으로 SOCEKT의 FD_READ와 FD_CLOSE를 잡아내어 OnClose, OnReceive 함수를 실행시킨다. virtual로 되어있어서
일반 CSocket사용과 동일하게 사용


1차 버젼으로 자주 쓰는 함수들만 작성해 놓았다.

그 외 CSocket(혹은 CAsyncSocket)에 있는 함수들은 시간날때 작성해 보도록 하자!
top

프로그래밍 - Windows/MFC

클라이언트 프로그램 짤때의 충고!!

절대! 간단한 프로그램을 짜더라도 간편하다는 이유로 MFC의 CSocket으로 짜는 짓은 하지 말자!
이전 싱글 코어 개발환경에서 별탈없이 잘 돌아가길래 CSocket을 이용하여 프로그램을 작성하였다. 개발환경 업그레이드 차원에서 듀얼코어 컴퓨터로 갈아 타서 프로그램을 돌려보니 이게 왠 걸..ㅡ.- 패킷이 정상적으로 통신이 되지 않는다.
혹시나 해서 관련 문서들을 찾아 봤더니 떡하니 이렇게 나와있다.
Microsoft provides a CSocket class for TCP/IP programming. Unfortunately the CSocket class is not thread-safe. (now you know why I presented the "bare" socket API instead of the MFC class.)
.....

개발하기 전엔 관련 문서를 찾아보자..

top