AfxExtractSubString() 함수는 strtok()와 같은 토큰분리 MFC함수이다...

함수의 원형은 아래와 같다.

BOOL AFXAPI AfxExtractSubString (
   CString& rString,
   LPCTSTR lpszFullString,
   int iSubString,
   TCHAR chSep = '\n'
);

각 인자의 의미는 아래와 같다.
rString : 결과물이 들어갈 곳
lpszFullString : 분리할 전체 문자열
iSubString : 분리할 문자열의 위치
chSep : 구분할 문자

아래는 샘플소스로 strFull에 들어있는 문자열이 ; 로 구분되서 최종 결과로는 aa, bb, cc, dd 순으로 MesssageBox를 이용 출력이 된다.

int iSub = 0;
CString strTok, strFull;
strFull = _T("aa;bb;cc;dd");
	
while(AfxExtractSubString(strTok, strFull, iSub++, ';'))
{
	MessageBox(strTok);
}

MSDN 원문 보기...
Posted by Gungume
,
const char* => LPCSTR

1. 'LP' 는 long pointer 의 의미 : 포인터 변수
2. 가운데 'C'const 의 의미 : 읽기전용
3. 끝에 STR 이라는 의미는 NULL 포인터로 끝난다는 의미 : 문자열로 생각
마지막 인덱스에는 항상 NULL 이 채워져 있어야 한다는 것.


LPSTR : Long(32-bit) Pointer to a Character STRing.
이 데이터 형같은 경우 예전에 우리가 사용하던 방식으로 선언하면
char *  : 유니코드를 지원하지 않기 때문에 각각의 문자는 1 byte


LPCSTR : Long(32-bit) Pointer to a Constant Character STRing.
이 데이터 형같은 경우 예전에 우리가 사용하던 방식으로 선언하면
const char * : 이것역시 유니코드를 지원하지 않기 때문에 각각의 문자는 1 byte


LPTSTR : Long(32-bit) Pointer to a T-Character STRing
                that is Portable for Unicode and DBCS.
이 데이터 형같은 경우, 윈도우즈가 유니코드를 지원하면서 새로 생긴형식
TCHAR * == WCHAR* : 유니코드를 지원하기 때문에 각 문자가 2 byte


LPCTSTR : Long(32-bit) Pointer to a Constant T-Character STRing
                  that is Portable for Unicode and DBCS.
이 데이터 형같은 경우, 윈도우즈가 유니코드를 지원하면서 새로 생긴형식
const TCHAR *  == const WCHAR* : 유니코드를 지원하기 때문에 각 문자가 2 byte


출처 : 놀구먹기위해 공부한다!
Posted by Gungume
,




예전에 zextor님의 블로그에서 "네이트온의 오프라인 사용자에게 말걸기"라는 글을 보고 간단히 프로그램을 만들어봤다...

C&P위주의 코딩이라서 딱히 에러처리같은건 없다;;;

일단 http://zextor.tistory.com/2669774 -> 이곳에서 오프라인 사용자에게 말거는 방법이 자세히 설명되어있다...(설명의 귀차니즘;;;)

프로그램은 위의 링크에서 설명된것중에서 대화창의 "WS_DISABLED" 플래그를 해제해주는 역할을 한다...

일단 프로그램의 모양은 아래와 같고 사용법은 Spy++이랑 같다...
Nate Offline

대화창을 활성화하기 위해서 프로그램을 실행하고 위에있는 링크에 있는 방법데로 오프라인표시로 의심되는 사용자의 대화창을 켠다.

이후에 프로그램의 버튼 옆에 있는 아이콘을 아래 스샷처럼 대화를 입력하는 창(=붉은색 네모)에 드래그한다...(이때 다른 부분에 하면 작동이 안된다...)

드래그할때 "ClassName"이 스샷처럼 "SOFTWEB_CONTROL"인것을 확인하고 "대화창 활성화" 버튼을 누른다...
대화창 활성화하기...

"대화창 활성화" 버튼을 눌렀을때 성공이라는 메시지가 보인다면 아래 스샷처럼 마우스로 대화창을 클릭하고나서 메시지를 보내면 된다...
활성화된 대화창 테스트...

Spy++ 관련기능 소스참조 : 데브피아 류신 (kurishin)님...
(사용언어 및 제작툴 : MFC / VS2005)

Posted by Gungume
,






올만에 뻘코딩 한번 해봤다...

1~45개의 각각의 번호에 대해서 여지까지 당첨됐던 횟수를 알려주는 간단한 프로그램이다...

데이터는 국민은행에서 매주 올려주는 엑셀파일을 활용했다...(http://lot.kbstar.com/quics?page=A005344)

초기버전에서는 엑셀파일에서 필요한 부분만 따로 텍스트파일로 저장해서 그 파일에 들어있는 정보를 불러와서 사용했었는데 엑셀파일을 직접 불러오는 방법으로 프로그램을 수정했다.

엑셀파일을 불러오는 부분은 코드프로젝트에서 'CSpreadSheet' 클래스를 받아다가 썼다
(CSpreadSheet - A Class to Read and Write to Excel and Text Delimited Spreadsheet)

사용법은 파일열기 버튼을 눌러서 파일을 불러온 후에 리스트컨트롤의 칼럼을 클릭하면 정렬이 되므로 원하는 형식으로 데이터를 보면 된다...

아래는 프로그램의 스샷으로 데이터를 불러온 후에 당첨횟수로 정렬을 한 상태이다...

Best Lotto Xls

(사용언어 및 제작툴 : MFC / VS2005)
Posted by Gungume
,




리스트컨트롤에서 칼럼을 클릭하면 정렬이 되는 예제소스이다...

사용된 구조체와 정렬함수를 예전에 미니탐색기 만들때 데브피아에서 구한것 같은데 정확한 출처는 기억이 안난다;;;

어쨌든 첨부파일은 미니탐색기에서 사용되었던 소스를 가져다가 간단하게 리스트컨트롤의 정렬기능을 만든 예제소스이다...

첨부파일에서 'Sort Class.zip'은 MFC용 클래스로 따로 만든 리스트컨트롤이다.

클래스는 그냥 리스트컨트롤에 컨트롤변수 연결후에 해당클래스로 이름을 바꿔서 사용하면 된다...

정렬은 리스트컨트롤의 SortItems() 함수를 이용하는데 원리를 대략적으로만 이해해서 자세한건 모른다;;;

이해한데로 대충 설명하면 아래 정렬함수 소스가 SortItems() 함수의 첫번째 인자로 들어가는 함수의 구현부로써 여기서 정렬부분을 구현한다.

lParam1, 2에 리스트컨트롤 목록에 있는 항목이 넘어오면 그것을 이용 값을 얻고 두개의 값을 비교해서 리턴 시켜주는것을 반복함으로써 정렬이 이뤄진다...


아래는 프로그램 스샷으로 랜덤으로 생성된 숫자를 리스트컨트롤 목록에 넣은 후 첫번째 칼럼을 정렬했을 때의 결과이다...

데이터 정렬

(사용언어 및 제작툴 : MFC / VS2005)

Posted by Gungume
,

Renamer2.exe

파일명 일괄변경 프로그램 - 2

기존에 만들었던 파일명 일괄변경 프로그램에 약간 손을 봤다...

우선 일련번호의 시작번호를 지정할 수 있는 기능을 넣었다.

기존 버전에서는 시작번호가 항상 1부터 시작되서 같은 분류에서 사진이 추가되는 경우 처음부터 파일명을 다시 지정해야되는 불편함이 있어서 입력한 숫자를 일련번호의 시작번호로 할수 있도록 기능을 넣었다...


그리고 리스트컨트롤의 컬럼을 클릭시 정렬하는 기능을 추가했다.

드래그&드롭시 선택된 파일의 중간지점을 잡고 끌어오면 그 파일을 기준으로 목록에 추가된다.

예를 들어 파일명이 FileName1~FileName10까지 있다면 전체 선택후 FileName5를 잡고 드래그를 하면 리스트컨트롤에 5~10, 1~4 이순서데로 들어가므로 파일명 변경시 원래 순서가 중요하다면 컬럼을 클릭함으로써 정렬을 하고 파일명 변경이 가능하다.

대충 만들어서 모든 컬럼에 대해 각각 정렬이 되니 사용시에는 '원본 파일명' 칼럼에 대해서만 정렬기능을 사용하면 될듯함...

Source: https://github.com/gungume/Renamer/releases/tag/0.2
(사용언어 및 제작툴 : MFC / VS2005)

이전 버전 받기
2006/09/05 - [프로그래밍.../Source] - 파일명 일괄변경 프로그램

최신버전 받기
2008/07/09 - [MFC/Application] - 파일명 일괄변경 프로그램 - 4

Posted by Gungume
,




예전에 만들었던 블랙리스트 추출기에 대한 업데이트 요청이 있어서 간단하게 업데이트 해봤다...

요청 내용은 추출할 게시판의 주소가 변경되서 자동모드가 작동이 안되는거랑 블랙리스트의 닉네임에 공백이 있는 경우에 인식을 못하는 문제였다...

게시판 주소 문제는 이전 버전에서 단순히 코드상에 주소를 입력했었기에 언젠가는(?) 문제가 될줄 알았기에 바로 수정을 했다.

그리고 추후 게시판 주소가 바뀔때를 대비해서 게시판 주소를 입력해서 추출하는 기능을 추가했다.

닉네임에 공백이 있는 경우 인식 못하는 문제는 입력을 문자열 단위로 받아서 생기는 문제였기에 라인 단위로 입력을 받게하는 것으로 간단히 해결~

블랙리스트 추출기 (업데이트-2)

(사용언어 및 제작툴 : MFC / VS2005)

기존 버전
2007/03/19 - [프로그래밍.../Source] - 블랙리스트 추출기 (업데이트-1)
2007/02/15 - [프로그래밍.../Source] - 블랙리스트 추출기(?)

Posted by Gungume
,

Html 파싱...

MFC/TIP 2007. 3. 31. 13:59




내용에 비해서 제목이 거창하다;;;

Html 파싱이라고 해서 특별한 방법을 설명하는것은 아니고 그냥 특정 게시판에서 자신의 원하는 데이터를 얻는 정도를 설명하려고 한다.

Html 파싱은 완전히 노가다이다...그래서 그런지 샘플소스 또한 완전 하드코딩이다 -_-;

샘플소스의 작동원리를 간단히 설명하면 아래와 같다.

1. 파싱할 웹페이지의 소스를 얻어온다.
2. 얻어온 소스를 CString 변수에 넣는다.
3. CString의 Find(), Mid(), Format() 함수 등을 이용해서 원하는 데이터를 얻는다.

간단하게 소스로 표현하면 아래와 같다.
// CString m_strSource; -> 파싱할 웹페이지 소스
CString strTmp;
int nStart=0, nEnd=0

nStart = m_strSource.Find("검색어 1", nEnd);
nStart += (int)strlen("검색어 1");
nEnd = m_strSource.Find("검색어2", nStart);
strTmp = m_strSource.Mid(nStart, nEnd-nStart);

위의 "검색어 1"과 "검색어 2" 사이에 파싱할 데이터가 위치하면 된다.

Font 태그를 이용해서 아래와 같은 예제를 작성할 수 있다.
// "<Font color=red>얻을 데이터</Font>"

nStart = m_strSource.Find("<Font color=red>", nEnd);
nStart += (int)strlen("<Font color=red>");
nEnd = m_strSource.Find("</Font>", nStart);
strTmp = m_strSource.Mid(nStart, nEnd-nStart);

위와 같이 하면 strTmp에 최종값은 "얻을 데이터"가 된다.

위의 샘플 소스를 기준으로 약간의 응용을 통해서 while()문을 이용해서 게시판 글 목록수 만큼 데이터를 얻어올 수 있다.

위 코드의 문제점은 아무래도 하드코딩이다 보니 특정게시판에 대해서만 사용이 가능하고 "검색어" 부분을 잘 설정해야 한다...

위의 샘플코드에 썼던 Font 태크 같은 경우는 얻으려는 데이터 이외의 곳에서도 많이 사용되는 태그니 엉뚱한곳의 데이터를 얻어올 가능성이 있다.

그러므로 검색어 부분은 얻으려는 데이터와 관련되면서 유일하게 쓰인 명령어를 삽입해야 한다.

아래는 샘플소스의 파싱부분을 처리하는 소스이다.


검색어 부분을 보면 하드코딩이라는게 적나라하게 들어난다...실력이 부족하니 어쩔수 없을듯 하다...좀더 괜찮은 방법을 공부해봐야겠다...


아래는 샘플소스 스샷 & 원래 게시판 스샷
샘플소스

원래 게시판

(사용언어 및 제작툴 : MFC / VS2005)
Posted by Gungume
,



메신져 등의 프로그램에서는 등록한 사용자가 로그인을 하거나 메시지 등을 수신하게 되면 작업표시줄 위에 조그맣게 메시지가 출력된다.

첨부파일은 이런 기능을 간단하게 구현한것으로 단순하게 작업표시줄의 위치를 얻은 후에 타이머를 이용해서 윈도우를 출력시켜준다.

예전에 올렸던 TV알리미 를 만들 때 생각나서 후딱 만들었던 건데 샘플소스를 날려서 다시 만들어봤다.

만들다가 맘에 안드는 부분을 바꾸다보니 기본원리는 같지만 소스가 좀 수정되었다.
(기존 소스에서는 Sleep() 함수를 사용했었는데 이 함수를 쓰면 마우스 이벤트가 안먹히는 문제로 첨부파일에 있는 소스에서는 타이머를 3개 쓰는 방법으로 변경함...)

우선 사용한 변수 및 상수값은 아래와 같다.
#define SHOW_WND 0
#define SLEEP_WND 1
#define HIDE_WND 2

CRect rect;
int m_nWindowWidth;
int m_nWindowHeight;
int m_nWindowBottom;
int m_nWindowTop;

그리고 OnInitDialog() 함수를 통해서 출력할 다이얼로그의 크기와 출력 위치 등을 설정후에 바로 타이머를 작동 시킨다.



타이머는 nIDEvent 값에 따라 3가지 상태로 작동을 하는데 순서데로 메시지출력(아래->위), 정지, 메시지닫기(위->아래)이다...

단순하게 처음에 출력할 윈도우를 작업표시줄에 두었다가 메시지출력시에 MoveWindows() 함수를 이용해서 타이머시간 및 rect 값에 따라서 윈도우가 위로 올라온다.

그 이후에 역시 타이머를 이용해서 5초 동안 윈도우를 정지 시켜놓고 이후에 출력의 반대과정을 거쳐서 윈도우를 아래로 내린다.



제작시에 프로젝트를 다이얼로그 기반으로 만든 후에, 리소스에서 다이얼로그를 하나 추가시켜서 클래스와 연결해서 사용했다.
사용하는측에서는 해당 다이얼로그 변수를 하나 만들고 그냥 DoModal()로 다이얼로그를 띄워줬다.
따로 클래스로 하나 빼서 쓰기 쉽게 만들고 싶지만 실력이 안된다;;;
참고자료 2번의 자료를 받으면 프로젝트에 가져다 쓰기 쉽게 잘 만들어졌다...
공부할 때는 몰라도 쓸때는 이미 검증된것 가져다 쓰는게 최고인것 같다 -_-


참고자료
1. 작업표시줄 영역얻기( jiniya.net )
2. 코드프로젝트( Taskbar Notification dialog )

(사용언어 및 제작툴 : MFC / VS2005)
Posted by Gungume
,

VS2005로 툴을 바꾸고나니 생각보다 불편한게 많다...이번에 거슬렸던것은 배포문제...

2003까지는 "Dependency walker"로 대충 의존성 따져서 DLL 파일 넣어주면 됐는뎅 2005는 안되는듯...

이곳저곳 뒤져본 결과 대충 아래와 같이 처리하면 아쉬운데로 실행은 되는듯함;;;

VS2005를 기본폴더에 설치했다는 가정하에 아래에 적힌 경로에 있는 파일들을 실행파일과 같이 넣어주면 된다.(폴더채로 같이 놔도 되는듯하다...)

경로 : "C:\Program Files\Microsoft Visual Studio 8\VC\redist\x86"

릴리즈모드로 컴파일했을때를 기준으로 Console 프로젝트의 경우는 위의 경로에서 "Microsoft.VC80.CRT" 폴더에 있는 파일을 실행파일과 같이 넣어주면 되고, MFC 프로젝트의 경우는 "Microsoft.VC80.MFC" 폴더를 추가로 넣어주면 실행이된다...(이외의 프로젝트는 안해봐서 모름;;;)


위의 방법으로 배포하면 상대방 컴에서 실행은 된다 ㅡㅡ;

좀더 간편하고 제대로된(?) 방법은 MS사에서 제공하는 "Microsoft Visual C++ 2005 재배포 가능 패키지"를 받아서 설치하는 것이다...
(다운받기...)


좀더 자세한 내용은 참고했던 사이트를 스크랩 및 링크해두니 참고바람...(첫번째 스크랩 자료는 그대로 복사해오니 길은 내용이 있어서 좀 짤린다;;;)

출처1 : RedistributingVisualCppRunTimeLibrary



출처2 : VS2005 실행모듈 배포하기
Posted by Gungume
,