List 컨트롤을 이용하여 대량의 데이터를 표시하고자 할때 InsertItem() 으로 데이터를 막 집어넣기만 할 것인가?
만일 간단한 문자열 데이터로만 이루어져 있다면 InsertItem() 으로 그냥 집어 넣으면 될 것이다.

만일 cheatengine 을 만든다고 했을때 메모리에서 100만개의 데이터를 찾았다고 가정해보자.
이 100만개의 데이터를 리스트 컨트롤을 이용하여 표시해야하는데 이번에 만든 cheatengine의 메모리 리스트컨트롤은 너무도 화려해서 각종 이미지가 포함되어 있고, 표시되는 데이터도 연관성에 따라서 매우 많은 정보를 보여준다.
그럼 리스트 컨트롤에 100만개의 데이터를 집어넣기 위해서 100만개의 이미지(갯수만큼)와 연관 데이터를 메모리에 올려야할까?
혹 만들어야 할 프로그램이 embeded system 에서 구동해야한다면 어떻게 할 것인가?

이 문제에 대한 해답을 다음링크로부터 얻을 수 있다.
http://www.codeproject.com/KB/list/BMPList.aspx

사실 영어 실력이 딸려서 열심히 설명을 읽었지만 도통 무슨내용인지 알 수가 없다. @.@~~

실제 샘플 프로젝트를 다운 받자. 

저자가 언급한 핵심 함수 부분에 브레이크 포인트를 걸어두고 실행시켜보면

아~~~!!!!!  (띵동띵동)




간단히 요약하자면

일단 100만개의 데이터(일종의 인덱스정보)를 컴팩드한 메모리 구조로 로딩한다. (어떻게 해서든지 알아낸 데이터는 있어야하므로)
 
리스트 컨트롤에 다음과 같이 row 수 만큼만 설정한다.
// This sets the count in the list without adding any items.  This is very fast.
m_cList.SetItemCountEx((int)m_MyDataArray.GetCount(), LVSICF_NOSCROLL|LVSICF_NOINVALIDATEALL);

비록 데이터가 아주 많다고 설정하였지만 실제 ListCtrl 에 추가한것이 아니므로 메모리는 크게 잡아먹지 않는다.

이젠 화면에 표시되는 Item 수 만큼만 그때 그때 표시한다.
void CBMPListDlg::GetDispInfo(NMHDR *pNMHDR, LRESULT *pResult)
{
// 이 함수는 화면에 표시되는 Item 갯수만큼 호출된다.
// row 갯수가 10개 이고 column 이 5개 라면 총 50회만 호출된다.
// 이 함수에서는 화면에 표시해야할 이미지가 있을때 로딩한다. (파일시스템으로 부터 로딩하면 되겠죠)
// 이 함수에서 추가로 표시해야할 데이터가 있다면 이때 다시 로딩한다. (예를들어서 내가 찾은 메모리의 속성정보나 모듈이름 등등등등)
}

이렇게 하면 100만개의 데이터를 리스트 컨트롤로 표시하더라도 키값이 4byte 라면 4메가의 데이터만 필요하다!!!!!

당장 쓸건 아니지만 알아두면 좋을것 같아서 포스팅해본다~~~
휴대폰과 첫 만남을 가진지 딱 10년이 지났다.

10년간 사용한 휴대폰은

LG -> SK -> 삼성 -> 삼성 -> LG

으로 변천사를 거쳤지만 공통점은 바로 대부분 공짜 폰이라는거다.

그런데 오늘 드디어 기십만원짜리 휴대폰을 구매했다.

그 이름은 바로

아! 이! 폰!



앞으로 더 많고 좋은 스마트폰이 나올 예정이라 많이 망설이기도 했지만 이미 질러버린몸..

최대한 뽕을 뽑고 말테닷! 


윈도우 모바일에서 X버튼은 프로그램을 SDI 혹은 MDI 으로 만들어야만 보여집니다.
(물론 직접 시스템 메뉴를 넣는다면 다이얼로그에서도 보여집니다.)

언제나 간단한 프로그램만 만들던 저에겐 다이얼로그 기반으로 만든 프로그램에서 OK 버튼 처리는 매우 쉬운 문제였습니다.
단지 OnOK() 함수를 오버라이드 하면 되니까요.

하지만 SDI 에서 X버튼은 조금 다릅니다.
아니 윈도우 모바일에서 다르다는말이 맞겠군요.

일반 Windows 플랫폼의 MFC 프로그램에서는 X버튼에 대한 처리는 OnClose() 에서 오버라이드해서 처리해주면 됩니다.

하지만 윈도우 모바일에서는 X버튼을 누를 경우 다르게 동작합니다.

일단 기본적으로 윈도우 모바일에서 X버튼은 프로그램을 백그라운드로 돌려버립니다.

그런 다음에 WM_SIZE 메세지가 호출됩니다. (물론 WM_CLOSE 나 WM_DESTROY 메세지는 호출되지 않습니다)

그래서 X버튼을 눌러서 프로그램을 종료하려면 WM_SIZE 의 메세지를 받아서 다음과 같이 처리하면 됩니다.
(MainFrame 에서 처리해야합니다.)

하지만 종료할때 사용자에게 물어봐야할 경우라면?

이미 윈도우는 백그라운드로 바뀐 상태에서 WM_SIZE 메세지를 타기 때문에 메세지 박스가 표시되지 않습니다.

그래서 꽁수로 백그라운드를 못하게끔 처리하는것입니다. -_-;

뭔가 정석이 있을것 같은데 해도 해도 안되길래 이런 꽁수를 생각했습니다.

그럼 이만.. .

당연히 직접 벤치마크를 했을리 없고..

그냥 관심갖는 그래픽카드가 나올때마다 벤치마크 찾기가 귀찮아서 잘 정리된 사이트 링크를 걸어둡니다.

http://www.playwares.com/xe/?mid=mainreview&search_target=title&search_keyword=4830&document_srl=454613&list&cpage

Windows Mobile 에서 고유번호를 알아내는 정석은 없는것 같습니다.

각 디바이스 벤더마다 알아서 시리얼 넘버를 결정하고 시리얼넘버를 보여주는 API를 제공할 수도 있고 제공하지 않을 수도 있기 때문입니다.

이곳저곳을 막 뒤지다가 발견한 소스입니다.

완벽한 시리얼 넘버를 구현할 필요가 없다면 꽁수를 써보는것을 추천하겠습니다만... 그 꽁수도 생각 나지 않아서.-_-;

다음 소스를 참고하세요.


Windows Mobile 5.0 SDK 부터는 MS 가이드라인 때문에 메뉴 구성이

새로만들기  메뉴  IME

3가지 뿐입니다. 이 것을 변경시키려고 며칠을 삽질하다가 알아낸 정보 링크를 걸어둡니다.

먼저 주 목적은 위 메뉴에서 새로만들기 메뉴를 없애거나 조작하고 싶어서 자료를 찾아보았습니다.

그러다가 발견한 m_bShowSharedNewButton = FALSE; 해주는 방법.

하지만 VS 2008 에서는 해당 변수의 선언을 찾지 못한다는 컴파일 에러가 뜹니다.

그이유는 바로 VS 2005 개발 가이드라인 때문입니다.
http://msdn.microsoft.com/en-us/library/ms838254.aspx

MS 에서 guideline 으로 위처럼 3개의 메뉴 이외에는 메뉴바에 붙이지 않도록 하겠다 라고 선포해버린거죠.

그래서 이걸 어떻게 해야하나.. 하다가 발견한 링크입니다.

http://cafe.naver.com/latem/1035

비록 원하는 메뉴를 여러개 붙일 수는 없지만 저 보기싫은 새로만들기 버튼은 조작할 수 있습니다.

이런 멋진 팁을 알려주신 분 너무 고맙습니다. (_._);

MFC 에서 스크롤바에 대한 개념이 없이 스크롤바를 제어하려다가 며칠 삽질을 했습니다.

폼뷰를 생성하여 뷰로 폼형태를 보여줄때 리소스창에서 폼뷰의 다이얼로그를 매우 크게하면 자동으로 스크롤바가 생성됩니다.

그런데 리소스창에 폼뷰의 다이얼로그를 작게 그릴 경우 스크롤바가 사라집니다.

동적으로 화면의 스크롤을 지정하려면???



원하는 시점에 이 코드를 불러주면 화면의 스크롤 영역이 지정됩니다.

스크롤을 이리저리 끌다보면 폼이 같이 움직이죠..

아 삽질한 시간이 얼마인가. ㅜㅜ

CDialog 로 UI 를 구성할 때 조건에 따라서 UI 가 동적으로 생성되어야 하는 경우가 있습니다.

이때 해당 UI 의 이벤트 처리를 담당하는 함수를 어떻게 등록하는지 알아보겠습니다.

보통 CDialog 에 콤포넌트를 등록하려면 리소스 편집기에서 콤포넌트를 추가한 다음에 이벤트 핸들러를 등록합니다.

이런것들은 통합개발툴(IDE) 에서 해주는데요.. Visual Studio 가 그런 것을 자동으로 만들어주고 메시지맵을 등록시켜줍니다.
하지만 이런 경우는 콤포넌트의 위치나 생성이 정해져 있는 경우 이므로 동적으로 처리해야하는 방법은 직접 코딩을 해주어야합니다.

먼저 동적으로 처리하는 가장 확실한 방법은 직접 해당 콤포넌트를 서브클래싱 하는 방법입니다.

예를들어서  CButton 을 동적생성하여 해당 버튼이 클릭되었을때 이벤트를 처리하려면

class CMyButton : public CButton {}

이런식으로 서브클래싱한 후에 ButtonClicked 이벤트를 직접 처리해주는 것이죠.

하지만 단순한 동작을 하기 위해서 서브클래싱을 해준다면 파일이 매우 많아질 뿐더러 소스도 지저분해지게 됩니다. (사실 이게 지저분한 소스인지는 제 주관입니다.)

그래서 다른 방법을 찾아보았습니다.

지금 사용할 방법은 동적으로 등록한 콤포넌트의 이벤트 핸들을 해당 부모 윈도우인 Dialog 에서 간단하게 처리하는 방법입닏.

ON_CONTROL_RANGE 메세지 맵을 이용합니다.

예제입니다.

CMyDialog.h


CMyDialog.cpp



이벤트 처리 핸들러를 다른것으로 등록할 경우에는 다른 콤포넌트의 이벤트를 간단하게 받을 수 있습니다 .
Sqlite3 소스코드에 있는 내용입니다.


윈도우 모바일 프로그래밍을 시작하는 대부분의 사람은 어디에서부터 어떻게 시작해야 하는지 막막할 것입니다.

요즘 모바일 프로그램을 해야할 사정이 생겨서 시작하게 되었는데 혼자알기에는 아깝고, 까먹을지 몰라서 간단하게 요약하고자 합니다.

Windows Mobile 프로그래밍의 시작은 어떻게 하는것이 좋을까요??

인터넷을 뒤져보면 아주 좋은 자료들이 많습니다.

어떤 기능을 하는 코드, 어떤 에러를 잡는 방법, 어떤 프로그램에 필요한 기술 등등 각종 단편적인 수많은 자료들이 존재하기 때문에 인터넷 자료를 기반으로 시작하시는 분들이 많습니다.

이런 방법도 매우 좋은 방법이긴 합니다. 하지만 프로그램을 배우는 흐름이 뒤죽박죽으로 섞이고 인터넷의 정보가 정확한 정보가 아닐 수도 있기 때문에 예상하지 못한 많은 시행착오를 겪을 수 있습니다.

그래서 저는 다음 방법을 추천합니다.

지금 곧장 가까운 서점에 가서 마음에 드는 책을 한권 사서 처음부터 차근 차근읽으십시오.

책의 서문과 Windows Mobile 시스템에 대한 이해, 그리고 계보 등을 이해하고 체계적으로 시작하는것을 추천합니다.

다만 이 글은 Windows Mobile 프로그래밍을 예전에 해봤다가 깜빡 기억이 안나는 분들을 위해서 준비했습니다.

다음 구성으로 연재를 할 예정입니다.

Windows Mobile 빌드환경 구성하기.

Windows Mobile 첫번째 프로그램 시작하기

Windows Mobile 더버깅 하기.

Windows Mobile 인터넷 연결하기.

Windows Mobile 리소스 파일 적용하기

Windows Mobile Sqlite를 활용한 DataBase 시스템


 




7월부터 헬스를 하고 있습니다.

평생 날씬하게 살것 같은 착각이 얼마전 샤워하고 본 모습에 무너져 내렸기 때문입니다.

작년보다 무려 5키로나 쪘고 뭘 먹지 않아도 뱃속이 든든한것이... 아름답게(?) 살이 찌기 시작하더군요.

아마도 점심시간에 항상 찾는 "이모네밥집" 때문인것 같습니다.

몸도 무기력해지고 마침 회사 동호회에서 할인행사도 한다고 해서 헬스동호회에 가입하게 되었습니다.


처음 헬스장에 가니 뭔가를 손에 쥐어줍니다.

바로 체지방을 측정하는 기구입니다.

측정한 체지방... 수치... 무슨 수치가 매우 복잡하지만 그래프를 보니까 다행히(?) 비정상은 아님!! 이더군요.

하지만 평균수치에서 최하에 근접하는 근육량과 최고수치를 넘어갈듯한 내장지방 수치.... 전형적인 ET 가 되기 직전이였습니다. 


대충 그림으로 표시해보자면..
--------------------------정상------------------------비만
|----------------|------------------------|---------------------|
---------------------↑근육량-------------------↑내장지방량---

이렇습니다. (헥헥! 그리기 힘들군요)





7월 16일 오늘까지 헬스장 5번! 갔습니다. -_-;

5일간 나름 열심히 운동을 해서 매일 약 350kcal 를 2시간에 걸쳐서 소비하였습니다.

그런데 엇그제 밤 갑자기 시장기가 돌아서 당연히... 그냥..무심코 집어든.. 라면..



보시다시피 아주 듬직하게 생겼습니다. 새로 구매한 EOS 450D 로 처음 찍혀본 영광스러운 놈입니다.

개인적으로 삼양라면을 무척 좋아합니다. 맛있어서요? 그게 아니라 농심을 별로 좋아하지 않거든요. 삼양라면의 MSG 사건 알만한 사람은 다 알죠.

아무튼....각설하고..

가스레인지에 물을 올리다가 본 뒷면...



쿠            쿵     무려 495kcal



2시간을 바짝 운동해야 겨우 350kcal 을 소모하는데.. 이뭐병... 이거 먹었다가는 2시간 헛고생 한것이 되겠더군요.

그래서 선택한 비장의 한수..








바로 요놈!!!!










운동을 하면서 열량에 신경이 쓰이기 시작하니까 평소에는 관심도 없던 식품 열량 수치가 눈에 들어오네요.

 이제 겨우 보름(5일) 했습니다. 앞으로 6개월간 빨래판(?) 을 목표로 열심히 달려볼렵니다.

아자!!!
팀에서 따로 하는 프로젝트에 doxygen 을 활용합니다.

doxygen 에 대한 설명은 여러 사이트에서 잘 설명을 해놓았습니다. 되도록이면 여기가 아닌 잘 정리된 사이트를 참고하시기 바랍니다.

이 글은 단순히 제가 참고하기 위해서 작성한 글입니다.

Doxygen 예제

// <---- 프로젝트 전체 설명
/// @mainpage 프로세스가 종료되는 시점 후킹
/// @section intro 소개
/// - 소개    : 목표로 하는 프로세스에 해당 dll 을 injection 시킨다.
/// @section Program 프로그램명
/// - 프로그램명 : ExitProcessHook
/// - 프로그램내용 : 프로세스가 종료되는 시점을 dll 에서 알아내기 위해 후킹한다.
/// @section CREATEINFO 작성정보
/// - 작성자  : Ggil
/// - 작성일  : 2009-05-19
/// @section MODIFYINFO 수정정보
/// - 수정일/수정자 : 수정내역
/// - 2009-05-20/Ggil : ExitProcess 대신 ExitProcess 를 후킹함.

// 특정 파일에 대한 설명.
/// @file TerminateProcess.cpp
/// @brief DLL 메인 소스파일. TerminateProcess 후킹하려고 이름을 정했다가 후킹함수만 변경하고 이름은 그대로 둠.

#include "stdafx.h"

 

/// @brief Dll의 진입 함수.
///
/// @param hModule 현재 dll 의 모듈 베이스
/// @param ul_reason_for_call 진입 함수의 호출 타입? 이유? 호출시점?
/// @param lpReserved 말 그대로 예약된 파라미터
/// @return 처리 결과(TRUE : 성공, FALSE : 실패)

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
      )
{
 static PFN_TERM NewExitProcess_Target = NULL; // ExitProcess 함수의 포인터
 HMODULE hTargetModule = NULL;

 switch (ul_reason_for_call)
 {
 case DLL_PROCESS_ATTACH:

  break;
 case DLL_PROCESS_DETACH:

  break;
 }

    return TRUE;
}


SVN 은 여러명의 공통의 프로젝트를 관리하는데 유용한 시스템입니다.

그러므로 SVN 에 저장될 데이터는 공통의 자료만 저장되어야만 다른 사람이 불편하지 않습니다.

 

다음은 Visual Studio 2005 에서 생성된 파일들 중에 임시/개인데이터 파일의 목록입니다.

SVN에서 Add 명령으로 모두 한꺼번에 추가하지말고 선택적으로 추가하시기를 바랍니다.

 

만일 아래 파일을 SVN 에 등록할 경우 매번 충돌이 생기거나 내용수정에 따른 modified 상태로 빨간색 표시가 나타날 것입니다.

 

[ SVN 에 추가하지 말아야할 파일 확장자 ]

  • Debug, Release 폴더를 포함하여 빌드 구성요소에 추가된 폴더 및 파일들. 
  • *.ncb
  • *.vcproj.컴터이름.사용자이름
  • *.suo
  • *.aps
  • *.opt
  • *.plg
이 되고싶습니다.







저작권에 문제가 될경우 즉시 삭제하겠습니다. todaysppc 에서 퍼왔습니다.



http://www.lotteimall.com/withframe/withopen.jsp?t_url=http://www.lotteimall.com/product/Product.jsp?i_code=2619334
믿을만하고... 롯데카드로 5프로 추가할인.. 추가배터리(3만)... 8G메모리(2만)..가방(1.5만).. 삼각대(2만)... 
83만원에서 8만원 빼면 정품 바디만 파는 현금몰과 엇비슷하군.

http://www.dnshop.com/front/product/ProductDetail?PID=E548_20080321&Sid=0024_A3000000_00_00
믿을만하고... 추가배터리...메모리2G 그닥.. 82만... 그닥.

블로그에 정말 가끔씩 소스코드를 올릴때가 있습니다.

그때마다 빌드툴에서 긁어붙이기를 하면 지저분해서 속이 상하는데요..

바로 이렇게 됩니다. 그냥 긁어붙일경우...  아주 너저분합니다.

 void CXButtonXPTestDlg::OnButton2()
{
 TRACE(_T("in CXButtonXPTestDlg::OnButton2\n"));

 UpdateData(TRUE);

 CString str = _T("");
 m_edtCount2.GetWindowText(str);
 int nCount = _ttoi(str);
 if (nCount < 0)
  nCount = 0;
 nCount++;
 str.Format(_T("%d"), nCount);
 m_edtCount2.SetWindowText(str);

 BOOL bToggled = m_XButtonXP.GetToggleState();
 TRACE(_T("toggle state=%d\n"), bToggled);

 if (m_bMessageBox)
  AfxMessageBox(_T("Button 2 pressed."), MB_OK|MB_ICONINFORMATION);
}


이런 너저분함을 없애기 위해서 몇군데 찾아봤습니다.

첫번째로 http://codepad.org/  입니다. 사이트상에는 글자에 색깔도 이쁘게 입혀지는데 긁어붙이니 그렇지 않네요.

 
void CXButtonXPTestDlg::OnButton2() 
{
	TRACE(_T("in CXButtonXPTestDlg::OnButton2\n"));

	UpdateData(TRUE);

	CString str = _T("");
	m_edtCount2.GetWindowText(str);
	int nCount = _ttoi(str);
	if (nCount < 0)
		nCount = 0;
	nCount++;
	str.Format(_T("%d"), nCount);
	m_edtCount2.SetWindowText(str);

	BOOL bToggled = m_XButtonXP.GetToggleState();
	TRACE(_T("toggle state=%d\n"), bToggled);

	if (m_bMessageBox)
		AfxMessageBox(_T("Button 2 pressed."), MB_OK|MB_ICONINFORMATION);
}



그리고 두번째로

http://code.google.com/p/syntaxhighlighter/

그런데 쓰기가 좀 불편합니다. 직접 태그를 입력하면 자바스크립트가 알아서 변경시켜주는거죠.

샘플 화면입니다. <== 샘플 화면을 지우고 직접 티스토리 스타일시트를 지정해보았습니다.
http://gyuha.tistory.com/193  <== 세팅법 참고.
 

(티스토리의 스킨을 수정할 경우 소스를 올릴때마다 자동으로 적용되므로 어쩌면 편할 수도 있습니다.



세번째 입니다. 첫번째 처럼 긁어붙이기가 되므로 쓰기 편하네요. 색깔도 예쁘게 잘 나옵니다.
http://quickhighlighter.com/
 
  1. void CXButtonXPTestDlg::OnButton2()
  2. {
  3.     TRACE(_T("in CXButtonXPTestDlg::OnButton2\n"));
  4.  
  5.     UpdateData(TRUE);
  6.  
  7.     CString str = _T("");
  8.     m_edtCount2.GetWindowText(str);
  9.     int nCount = _ttoi(str);
  10.     if (nCount < 0)
  11.         nCount = 0;
  12.     nCount++;
  13.     str.Format(_T("%d"), nCount);
  14.     m_edtCount2.SetWindowText(str);
  15.  
  16.     BOOL bToggled = m_XButtonXP.GetToggleState();
  17.     TRACE(_T("toggle state=%d\n"), bToggled);
  18.  
  19.     if (m_bMessageBox)
  20.         AfxMessageBox(_T("Button 2 pressed."), MB_OK|MB_ICONINFORMATION);
  21. }


마지막으로 http://www.chamisplace.com/colorizer/cc.asp 

이 사이트는 괄호가 인상적이네요. 큼지막 합니다.

 1: void CXButtonXPTestDlg::OnButton2()
2: //=============================================================================
3:
{
4: TRACE(_T("in CXButtonXPTestDlg::OnButton2\n"));
5:
6: UpdateData(TRUE);
7:
8: CString str = _T("");
9: m_edtCount2.GetWindowText(str);
10: int nCount = _ttoi(str);
11: if (nCount < 0)
12: nCount = 0;
13: nCount++;
14: str.Format(_T("%d"), nCount);
15: m_edtCount2.SetWindowText(str);
16:
17: BOOL bToggled = m_XButtonXP.GetToggleState();
18: TRACE(_T("toggle state=%d\n"), bToggled);
19:
20: if (m_bMessageBox)
21: AfxMessageBox(_T("Button 2 pressed."), MB_OK|MB_ICONINFORMATION);
22: }



각각 장단점이 있습니다. 취향에 맞게 선택하시면 되겠네요.
요즘 저작권이 어쩌고 저쩌고 말들이 많습니다. 위반된다면 조속히 삭제할테니 고발만은 제발!!!

원본글 : http://kmstudio.egloos.com/1530905




그리고 이 노래가 올라온 사연입니다.


캠릿브지 대학의 연결구과에 따르면,

한 단어 안에서 글자가 어떤
순서로 배되열어있는가 하것는은
중하요지 않고, 첫째번와 마지막
글자가 올바른 위치에 있것는이
중하요다고 한다. 나머지 글들자은
완전히 엉진창망의 순서로 되어
있지을라도 당신은 아무 문없제이
이것을 읽을 수 있다.

왜하냐면 인간의 두뇌는 모든 글자를 하나
하나 읽것는이 아니라 단어 하나를
전체로 인하식기 때이문다

다른 스레드에서 생성한 다이얼로그를 강제로 죽이려면??

pDlg->DestroyWindow() <== ?

이러면 제대로 종료되지 않습니다.

pDlg->CloseWindow() <== ?

마찬가지로 종료되지 않습니다.

SendMessage(pDlg->GetSafeHwnd(), WM_CLOSE, NULL, NULL)

종료되지 않습니다.


모달 다이얼로그를 종료시키는 방법은 EndDialog() 함수를 호출하는 방법뿐입니다.

pDlg->EndDialog(IDOK); 혹은  pDlg->EndDialog(IDCALCEL);

을 호출하면 해당 다이얼로그는 종료가됩니다.

삽질하지말자!!!

처음 시나리오.
1. LBUTTONDOWN 메세지를 받아서 최초 클릭위치 저장
2. MOUSEMOVE 메세지를 받아서 드래그 상태이면 이동한 만큼 다이얼로그 이동. 클릭위치 업데이트

이렇게 했었는데.. 뭐 가능할지도..안해봐서 모르겠지만 더 편한 방법이 있습니다.

바로 LBUTTONDOWN 메세지를 받으면 다이얼로그박스타이틀바 에 메세지를 보내는거죠.

즉 타이틀바를 클릭해서 드래그하는것 과 같은 효과를 주는겁니다.

void CMyDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
 RECT rect;
 GetWindowRect(&rect);
 if( ( point.x < rect.right  || point.x > rect.left ) ||
  ( point.y < rect.top || point.y > rect.bottom ) )
 {
  DefWindowProc(WM_NCLBUTTONDOWN, HTCAPTION, MAKELPARAM(point.x, point.y));
 }

 CDialog::OnLButtonDown(nFlags, point);
}

이러면 끝!!!

dll 이 자신이 로딩중인 프로세스의 죽는 시점을 알아내기 위해서 다음 함수를 후킹하면 됩니다.

// Ends the calling process and all its threads.
VOID WINAPI ExitProcess(
  __in  UINT uExitCode
);


어설프게 TerminateProcess 를 후킹해서 왜 안불려질까 멍청하게 고민을 하다니. ㅡㅡ;

다른프로세스에서는? 안해봤지만 후킹하지않고 ToolHelp API 으로 열심히 프로세스를 뒤지다가 없어지면 종료된 시점으로 간주하면 되지 않을까???


http://nakohja.com/car/?n=%B1%E8%C5%C2%C8%F1

김태희의 미래 차???

난 벤츠...
그냥 binary editor 으로 뒤져도 되지만 windbg 로 볼 경우 좀더 편하다.

준비물 : 분석할 exe 파일과 그 파일의 pdb

1. F6(File->Attach to a Process..) 으로 분석할 프로세스(exe) 선택.

2. 커맨드 창이 뜨면 .symfix+ c:\symbols 실행

3. File -> Symbol File Path 실행한 후 Browse.. 버튼을 클릭하여 pdb 파일이 있는 폴더를 선택.

4. 프로세스를 계속 실행시킬 경우 F5 키 누르고 멈출려면 Ctrl+Break 키 누름

5. .reload *  과 ld * 으로 심볼 다시 로딩
"ERROR : Symbol file could not be found."  에러는 다른 모듈(exe 가 로딩하는 각종 dll 등)의 심볼을 못찾으므로 발생하는 에러임. .무시

6. 마지막으로 lml 으로 제대로 로딩되었는지 확인... 실행파일의 심볼이 로딩되어 있어야함. 일반적으로 0x400000 위치.

여기까지 pdb를 로딩하는 방법.

이제 이걸 통해서 실제 심볼을 표시해보자.

x 실행파일이름!*검색할심볼명*
ex : x sample!*g_*     <== sample.exe 에서 g_ 가 들어가 있는 모든 심볼 표시
dt 실행파일이름!*검색할심볼명*
ex : dt sample!*g_*     <== sample.exe 에서 g_ 가 들어가 있는 모든 타입 심볼 표시

이러면 심볼이 주루룩 나타난다.

만일 pdb 파일이 실행파일과 싱크(?) 가 맞지 않을 경우에는 강제로 pdb 파일을 로딩해야한다.

.reload /i 실행파일.exe

그리고 다시 lml 으로 제대로 심볼을 로딩했는지 확인하면 끝!!!

마지막으로 팁으로...

심볼 이름으로 브레이크포인트 걸기 : bp 실행파일!심볼이름
특정 심볼(변수)의 정보 보기 : dt 실행파일!심볼이름
특정 심볼에 접근(쓰기)하는 경우 브포 걸기 : ? 실행파일!심볼이름   으로 주소를 찾고   ba w4 주소  를 입력함.
실행되고있는 스레드 정보 보기 : Alt + 9
해당 스레드의 콜스택 : 스래드 선택하고 kb
특정 명령어의 정보보기 : .hh 명령어

이상 끝!


뭘해야하는지 알아봤다...

승소했다고 다 끝나는게 아니더군..

쩝.

방문자가 거의 없다...

뭐 방문자가 없더라도 상관은 없지만..

도메인이 만료되어 버렸다...

1월  쯤에 만료된다는 사실을 알고 있으면서 차일 피일 미루다가...

복구비용이 6만원이란다...

그냥. 다른 도메인을 쓰거나 100일뒤에 풀리면 다시 사던가 해야겠다..

근데 복구비용 6만원. -_-; 쳇.

새로운 도메인 네임을 생각해봐야지.

+ Recent posts