MyAlbum   Pet
DirectX   openGL   Java   C/C++   STL   C#   Python   Window   ActiveX   SE & Refactoring   Game   Unicode   googleDesktop   Network   Database   Web   php   asp   asp.net   Library   QT   wxWidget   Something to read  
ToDo
zelon's WebAlbum
Google Tools
Google Naver map
ToRearrange
OpenOffice.org
Eclipse
Check W3 validator
Windows Programming
e i R f
Anonymous

목차 #


Contents

1 목차
2 윈도우 아이콘 프로그래밍 Windows Icon Programming
3 메모리 릭 잡기 Memory Leak
4 윈도우 콘솔 프로그래밍 Windows Console Programming
4.1 콘솔 전체 색깔 바꾸기 Change Console Color
4.2 콘솔 특정 위치로 커서 이동 Move Console Cursor
5 win32 항상 위 alwaysontop topmost
6 탐색기 띄울 때의 옵션들
7 비스타에서의 UAC 권한 관련 문제
8 MFC 및 Win32 에서 창 투명하게 하기
9 전역 단축키 설정 및 해제
10 배포
11 IsDebugged 얻기
12 ms 로부터 받는 심볼 패스 symbol path
13 시스템 메뉴 확장 - always on top 버튼 삽입
14 call stack 추적하기
15 win32 에서 IE embed 하기
16 IE 프로그래밍관련
17 windows ping program
18 모든 윈도우에 '항상 위' 버튼 달기
19 shellexecute
20 list control tip
21 탐색기(explorer) 로부터의 drag&drop 메시지 받기
22 internet explorer 띄우기 by win32
23 Regstry Wrapper
24 CreateProcess
25 현재 프로그램의 실행 파일의 폴더 위치 얻기
26 DrWatson
27 radio 버튼
28 VisualStudio.NET 2003 의 제품별 차이
29 VS.NET 에서 만든 프로그램을 윈98 에서 실행할 때의 문제
30 VC++ 6.0 에서 VC.NET 2003 으로 넘어가기
31 MFC
31.1 CExplorer 로부터 IWebBrowser2 얻기
31.2 HWND, CWnd
31.3 다이얼로그 기반에서 엔터키로 종료, ESC 키로 종료 막기
32 Windows Programming
32.1 프로파일링 관련
32.2 CreateProcess
32.3 리스트 컨트롤(list control) 에서 선택시 전체 줄을 선택하게 하기
32.4 FindFile
32.5 delete recursive
32.6 getURL from IE
32.7 Win32 Resource Starting
32.8 How to Window Driver
32.9 현재 프로그램의 hInstance 얻어오기
32.10 ListControl 에서 전체 row 선택하기
32.11 Debugging Tools for Windows 얻기
33 Visual Studio 가 만들어내는 파일 확장자 모음
34 디버깅 환경 설정 하기
34.1 BugSlayer & Install Symbol Server
35 윈도우 화면 보호기 끄고 켜기
36 mutex 를 이용하여 하나의 어플리케이션만 띄우기
37 윈도우 설치 후 기본 상태
37.1 윈도우98(English)
38 기타
38.1 xp 의 익스프로러바 같은 UI 만들기
38.2 #define WIN32_LEAN_AND_MEAN 의 의미
38.3 각종 무료 아이콘을 받을 수 있는 곳
39 링크들


2 윈도우 아이콘 프로그래밍 Windows Icon Programming #


3 메모리 릭 잡기 Memory Leak #


1. 프로그램 시작하는 부분에
#include <crtdbg.h>
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
를 넣는다.

2. 메모리릭을 체크할 부분에 아래 코드를 넣는다.
#include <crtdbg.h>
#ifdef _DEBUG
#define new new(_CLIENT_BLOCK, __FILE__, __LINE__)
#endif

3. 출력창에 메모리릭이 난부분을 클릭한다.
이동됨

4. MFC사용시에는 제거한다.
충돌됨

4 윈도우 콘솔 프로그래밍 Windows Console Programming #


4.1 콘솔 전체 색깔 바꾸기 Change Console Color #


system("color 1a");

4.2 콘솔 특정 위치로 커서 이동 Move Console Cursor #

void gotoxy(int x, int y)
{
   COORD Pos = {x - 1, y - 1};
   SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), Pos);
}


5 win32 항상 위 alwaysontop topmost #

// enable
SetWindowPos(m_hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE);

// disable
SetWindowPos(m_hWnd, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE);

6 탐색기 띄울 때의 옵션들 #


7 비스타에서의 UAC 권한 관련 문제 #


8 MFC 및 Win32 에서 창 투명하게 하기 #

SetWindowLong(m_hWnd, GWL_EXSTYLE, WS_EX_LAYERED);
SetLayeredWindowAttributes(RGB(0,0,0), 120, LWA_ALPHA);

9 전역 단축키 설정 및 해제 #

enum
{
	HOTKEY_MAXIMIZE = 100,
	HOTKEY_RESTORE = 101,
	HOTKEY_MINIMIZE = 102
};


void CHotKey::RegistHotKey()
{
	BOOL bRet = RegisterHotKey(NULL, HOTKEY_MAXIMIZE, MOD_WIN, VK_UP);

	if ( FALSE == bRet )
	{
		::MessageBox(NULL, L"Can't regist hotkey", L"", MB_OK);
	}

	bRet = RegisterHotKey(NULL, HOTKEY_RESTORE, MOD_WIN, VK_DOWN);

	if ( FALSE == bRet )
	{
		::MessageBox(NULL, L"Can't regist hotkey", L"", MB_OK);
	}

	bRet = RegisterHotKey(NULL, HOTKEY_MINIMIZE, MOD_WIN, VK_LEFT);

	if ( FALSE == bRet )
	{
		::MessageBox(NULL, L"Can't regist hotkey", L"", MB_OK);
	}
}


void CHotKey::UnregistHotKey()
{
	BOOL bRet = ::UnregisterHotKey(NULL, HOTKEY_MAXIMIZE);

	if ( FALSE == bRet )
	{
		::MessageBox(NULL, L"Can't unregist hotkey", L"", MB_OK);
	}

	bRet = ::UnregisterHotKey(NULL, HOTKEY_RESTORE);

	if ( FALSE == bRet )
	{
		::MessageBox(NULL, L"Can't unregist hotkey", L"", MB_OK);
	}

	bRet = ::UnregisterHotKey(NULL, HOTKEY_MINIMIZE);

	if ( FALSE == bRet )
	{
		::MessageBox(NULL, L"Can't unregist hotkey", L"", MB_OK);
	}
}


void CHotKey::OnHotKey(WPARAM hotkey)
{
	switch ( hotkey )
	{
	case HOTKEY_MAXIMIZE:
		{
			HWND hTopWindow = ::GetForegroundWindow();

			if ( hTopWindow != NULL )
			{
				::ShowWindow(hTopWindow, SW_MAXIMIZE);
			}
		}
		break;

	case HOTKEY_RESTORE:
		{
			HWND hTopWindow = ::GetForegroundWindow();

			if ( hTopWindow != NULL )
			{
				::ShowWindow(hTopWindow, SW_RESTORE);
			}
		}
		break;

	case HOTKEY_MINIMIZE:
		{
			HWND hTopWindow = ::GetForegroundWindow();

			if ( hTopWindow != NULL )
			{
				::ShowWindow(hTopWindow, SW_MINIMIZE);
			}
		}
		break;


	}
}

10 배포 #


11 IsDebugged 얻기 #


int isDebug()
{
	int iRet;

	__asm
	{
		mov eax, dword ptr FS:[0x30]
		mov ebx, 0
		mov bl, byte ptr [eax+2]
		mov eax, ebx
		mov iRet, eax
	}
	return iRet;
}

12 ms 로부터 받는 심볼 패스 symbol path #

SRV*\\localhost\d$\Symbol\OSSymbols*http://msdl.microsoft.com/download/symbols;SRV*\\localhost\d$\Symbol\ProductSymbols;C:\Windows\system32

13 시스템 메뉴 확장 - always on top 버튼 삽입 #


14 call stack 추적하기 #


15 win32 에서 IE embed 하기 #


16 IE 프로그래밍관련 #


17 windows ping program #


18 모든 윈도우에 '항상 위' 버튼 달기 #


19 shellexecute #


주로 shell 에게 실행을 맡길 때 사용한다. 대표적으로 웹 페이지를 다음과 같이 띄울 수 있다.

ShellExecute(HWND_DESKTOP, "open", "http://www.wimy.com", NULL, NULL, SW_SHOWNOACTIVATE );

20 list control tip #

이 글은 조경민(bro@ssm.samsung.co.kr)님이 작성하신 글을 스크랩 해온 것입니다.
=====================================================
[포함된 팁]

 1. 특정 ROW 포커스 주기
 2. 특정 ROW로 가기
 3. 헤더 컬럼수 얻어오기
 4. 컬럼의 너비를 이쁘게 주기
 5. 한줄 쭉 선택되게 하기, 그리드 라인 주기
 6. 선택한 아이템(ROW)를 지우기
 7. 두 아이템을 스왑 하기
 8.기존에 선택되어있는 것을 해체하기


  1. 특정 ROW 포커스 주기

---------------------------------------------------

 리스트 컨트롤에서 어떤 특정 Row를 선택하게 하고 싶을때 아래처럼 선택 할 수 있습니다.

 ( 이때 선택뿐아니라 포커스도 가야 합니다. 포커스가 간다는 의미는 다음에 키다운을 하면 바로 부드럽게 다음 아이템을 가리키도록 하는 것입니다 )

 

ListView_SetItemState (pListCtrl->GetSafeHwnd(),         // handle to listview
                       10, // index to listview item
                       LVIS_FOCUSED | LVIS_SELECTED, // item state
                       0x000F); // mask
 

 

 

 2. 특정 ROW로 가기

---------------------------------------------------

 만일 원하는 Row를 스크롤을 하던 어떻게 하든 화면에 보이게 하고 싶을때

 

pListCtrl->EnsureVisible(15, TRUE);
 

 

 3. 헤더 컬럼수 얻어오기

---------------------------------------------------

 헤더 컬럼의 갯수를 알고 싶을때

 

CHeaderCtrl* pHeader = (CHeaderCtrl*)GetDlgItem(0);
int nColumnCount = pHeader->GetItemCount();
     

 또는 pList->GetHeaderCtrl()을 통해서 얻어올수 도 있습니다.

 

 

 4. 컬럼의 너비를 이쁘게 주기

---------------------------------------------------

    공백없이 컬럼의 너비를 컬럼 라벨 너비에 맞게 정렬해줍니다.

 

부모 다이얼로그의 OnSize에서

 

void CAttrListDlg::OnSize(UINT nType, int cx, int cy) 

{

    CDialog::OnSize(nType, cx, cy);

    

    // TODO: Add your message handler code here

    if( IsWindow( z_AttrList.m_hWnd ))

    {

        z_AttrList.MoveWindow( 0, 0, cx, cy );

        z_AttrList.SetColumnWidth(1 , LVSCW_AUTOSIZE_USEHEADER);

    }

}

   

  

 

 5. 한줄 쭉 선택되게 하기, 그리드 라인 주기

---------------------------------------------------

 

 z_AttrList.SetExtendedStyle(LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT); 

 

 

 6. 다중 선택한 아이템(ROW)를 지우기

---------------------------------------------------

 

CDWordArray m_anDragIndexes;    // 선택한 아이템을 기억하는

 배열

 

int    CAttrList::fnRemoveItem()

{

    m_anDragIndexes.RemoveAll();

    POSITION pos = GetFirstSelectedItemPosition();

    while (pos)

    {

        m_anDragIndexes.Add(GetNextSelectedItem(pos));

    }

 

    int nSize = m_anDragIndexes.GetSize();    

    int nRet = -1;

    if( nSize )

        nRet = m_anDragIndexes[0];    

 

    while( nSize-- )

        DeleteItem( m_anDragIndexes[nSize] );

 

    m_anDragIndexes.RemoveAll();

    return nRet;

}

 

 

 

 7. 두 아이템을 스왑 하기

---------------------------------------------------

 

void CAttrList::fnSwapItem( int nItem1, int nItem2 )

{

    int hi = nItem2;

    int lo = nItem1;

    CStringArray rowText;

 

    LV_ITEM lvitemlo, lvitemhi;

    CHeaderCtrl* pHeaderCtrl = GetHeaderCtrl();

    int nColCount =pHeaderCtrl->GetItemCount();

            

    rowText.SetSize( nColCount );

    int i;

    for( i=0; i 

        rowText[i] = GetItemText(lo, i);

    lvitemlo.mask = LVIF_IMAGE | LVIF_PARAM | LVIF_STATE;

    lvitemlo.iItem = lo;

    lvitemlo.iSubItem = 0;

    lvitemlo.stateMask = LVIS_CUT | LVIS_DROPHILITED |

        LVIS_FOCUSED | LVIS_SELECTED |

        LVIS_OVERLAYMASK | LVIS_STATEIMAGEMASK;

    

    lvitemhi = lvitemlo;

    lvitemhi.iItem = hi;

    

    GetItem( &lvitemlo );

    GetItem( &lvitemhi );

    

    for( i=0; i 

        SetItemText(lo, i, GetItemText(hi, i));

    

    lvitemhi.iItem = lo;

    SetItem( &lvitemhi );

    

    for( i=0; i 

        SetItemText(hi, i, rowText[i]);

    

    lvitemlo.iItem = hi;

    SetItem( &lvitemlo );

}

 

 

 8.기존에 선택되어있는 것을 해체하기

 -----------------------------------

 

        int nOldItem = GetSelectionMark();

        if( nOldItem > 0 )

            SetItemState( nOldItem , 0, LVIS_SELECTED);

 

정리

 이상으로 몇가지 리스트 컨트롤을 사용함에 있어 간단한 팁을 알아보았습니다. 

21 탐색기(explorer) 로부터의 drag&drop 메시지 받기 #


CreateWindow() 를 할 때 WS_EX_ACCEPTFILES 를 넣어주거나, DragAcceptFiles() 함수를 한번 호출해주면 WM_DROPFILES 메시지를 받을 수 있게 된다.

WM_DROPFILES 메시지를 받으면, DragQueryFile() 함수를 통해서 드래그된 파일들을 읽을 수 있다.

22 internet explorer 띄우기 by win32 #


#include <ObjBase.h>
#include <WTypes.h>
#include <ExDisp.h>



			IWebBrowser2*   m_pWebBrowser; 

			if (FAILED(CoInitialize(NULL)))    
				return FALSE; 

			// Instantiate a browser 
			if (FAILED(CoCreateInstance(CLSID_InternetExplorer,NULL, 
				CLSCTX_LOCAL_SERVER, IID_IWebBrowser2, 
				(LPVOID*)&m_pWebBrowser))) 
				return FALSE; 

			// Capture Explorer HWND 
			if((g_hExplorer = FindWindow("IEFrame", "Microsoft Internet Explorer")) == NULL) 
				return FALSE; 

			//m_pWebBrowser->put_Visible(TRUE);
			m_pWebBrowser->put_Width(200);
			m_pWebBrowser->put_Height(200);
			//m_pWebBrowser->Navigate2(_T("http://www.wimy.com"), 0, 0, 0, 0);


23 Regstry Wrapper #


24 CreateProcess #

	STARTUPINFO si;
	PROCESS_INFORMATION pi;

	ZeroMemory( &si, sizeof(si) );
	si.cb = sizeof(si);
	ZeroMemory( &pi, sizeof(pi) );

	// Start the child process. 
	if( !CreateProcess( NULL, // No module name (use command line). 
		"BugReporter.exe", // Command line. 
		NULL,             // Process handle not inheritable. 
		NULL,             // Thread handle not inheritable. 
		FALSE,            // Set handle inheritance to FALSE. 
		0,                // No creation flags. 
		NULL,             // Use parent's environment block. 
		NULL,             // Use parent's starting directory. 
		&si,              // Pointer to STARTUPINFO structure.
		&pi )             // Pointer to PROCESS_INFORMATION structure.
		) 
	{
		//ErrorExit( "CreateProcess failed." );
	}


25 현재 프로그램의 실행 파일의 폴더 위치 얻기 #

char szGetFileName[FILENAME_MAX] = { 0 };
DWORD ret = GetModuleFileName(GetModuleHandle(NULL), szGetFileName, FILENAME_MAX);

if ( ret == 0 )
{
	_ASSERTE(!"Can't get module folder");
}
char szDrive[_MAX_DRIVE] = { 0 };
char szDir[_MAX_DIR] = { 0 };
_splitpath(szGetFileName, szDrive, szDir, 0, 0);

m_strProgramFolder = szDrive;
m_strProgramFolder += szDir;

26 DrWatson #


  • DrWatson 은 윈도우 환경에서 coredump 를 만들어 주는 프로그램이다. 기본적으로 프로그램이 크래시될 때 덤프 파일을 만들어 디버깅을 돕는다.

27 radio 버튼 #


group 을 true 한 것부터 마지막 false 까지가 하나의 그룹이 된다.

예를 들어 radio1=true, radio2=false, radio3=false, radio4=true, radio5=false 라면 (radio1,radio2,radio3), (radio4,radio5) 이렇게 그룹으로 나뉘게 된다.

28 VisualStudio.NET 2003 의 제품별 차이 #


29 VS.NET 에서 만든 프로그램을 윈98 에서 실행할 때의 문제 #

30 VC++ 6.0 에서 VC.NET 2003 으로 넘어가기 #


31 MFC #


31.1 CExplorer 로부터 IWebBrowser2 얻기 #



	// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
	IWebBrowser2 * pWebBrowser;// = (IWebBrowser2*)(&m_explorer);

	CComPtr<IUnknown> pWebBrowserUnk = m_explorer.GetControlUnknown();

	// IWebBrowser2 Interface 얻기
	HRESULT hr = pWebBrowserUnk->QueryInterface(IID_IWebBrowser2, (void**)&pWebBrowser);
	if ( !SUCCEEDED(hr) ) AfxMessageBox("error : m_pWebBrowserUnk->QueryInterface");

	//m_webBrowser.MoveWindow(0, 0, MAKER_SELECT_WIDTH, MAKER_SELECT_HEIGHT, true);

	pWebBrowser->GoHome();

31.2 HWND, CWnd #

1.함수에서 CWnd 가 필요한데 HWND밖에 없을 때

    CWnd* pWnd = CWnd::FromHandle(HWND);

2.HWND가 필요한데 CWnd 밖에 없을때

   HWND hWnd  =  pWnd->m_hWnd; 

31.3 다이얼로그 기반에서 엔터키로 종료, ESC 키로 종료 막기 #



CDialog 의 PreTranslateMessage 를 override 하여 다음과 같이 코딩한다.


BOOL CTestDlg::PreTranslateMessage(MSG* pMsg)
{
	if ( pMsg->message == WM_KEYDOWN )
	{
		if ( pMsg->wParam == 13 // enter key
			|| pMsg->wParam == 27 ) // esc key
		{
			return FALSE;
		}
	}

	return CDialog::PreTranslateMessage(pMsg);
}

32 Windows Programming #


32.1 프로파일링 관련 #


안녕하세요. 매크로 없는 메비~랍니다. 

저는 포기했지만 좀 엄한 기능을 활용할 수 있습니다. 컴파일 옵션에 보면 함수가 시작될때마다 특정 함수를 호출하게 하는
 컴파일 옵션이 있습니다. 프로파일러등에서 쓰이기 위해서 넣는것이라는데 VS.NET 2003 에서의 컴파일 옵션은 /Gh /GH 두가지입니다.
 함수가 불리고 리턴할때마다 한번씩 호출되어주는 것인데 이것을 이용하면 프로파일러를 만들 수 있습니다. 단지.. 함수 호출시마다
 부하가 걸리는 문제가 있고 함수 포인터별로 잘 정리해서 써야하는 문제가 추가로 발생하겠죠. 

아.. 질문의 답변을 빠트렸군요. Debugging API 란 녀석들을 쓰면 함수 이름을 알 수 있습니다. 써야 할 함수는
 SymFromAddr() 류의 symbol lookup 하는 함수입니다. 관련 정보를 얻으시려면 Debugging Application 류의 책과 몇몇 
디버거 관련 자료를 직접 읽어보시는 쪽이 가장 빠를텐데 일단 이 함수와 PDB를 함께 사용하면 쉽게 함수 포인터나 실행중의
IP(Instruction Pointer)에서 함수명을 알아낼 수 있습니다. 


p.s.VS 6.0에서 해볼때는 /GH 가 없더니 이번에 생겼군요. 

p.s.2.검색할때 "Calls hook function _penter" 내용으로 검색 해보시면 될듯~

- from gpgstudy

32.2 CreateProcess #



	STARTUPINFO si;
	PROCESS_INFORMATION pi;

	ZeroMemory(&si, sizeof(si) );
	si.cb = sizeof(si);
	ZeroMemory(&pi, sizeof(pi) );

	if ( !CreateProcess( NULL,
		"Z:A.exe C:execconf",
		NULL,
		NULL,
		FALSE,
		0,
		NULL,
		NULL, &si, &pi) )
	{
		DWORD dwErrorCode = GetLastError();
		cout << "Can't create process : " << dwErrorCode << endl;
		return -1;
	}
	else
	{
		WaitForSingleObject(pi.hProcess, INFINITE);

		if (!CloseHandle(pi.hProcess) ) cout << "Can't CloseHandle pi.process" << endl;
		if (!CloseHandle(pi.hThread) ) cout << "Can't CloseHandle pi.thread" << endl;
	}



32.3 리스트 컨트롤(list control) 에서 선택시 전체 줄을 선택하게 하기 #


  • MFC 의 경우
 m_listControl.SetExtendedStyle(LVS_EX_FULLROWSELECT);

32.4 FindFile #

void ZFindFile(const char *path, std::vector<std::string> & foundStorage, bool bFindRecursive = false)
{
	HANDLE hSrch;
	WIN32_FIND_DATA wfd;
	//memset(&wfd, 0, sizeof(wfd));
	char fname[MAX_PATH] = { 0 };
	BOOL bResult=TRUE;
	char drive[_MAX_DRIVE] = { 0 };
	char dir[MAX_PATH] = { 0 };
	char newpath[MAX_PATH] = { 0 };

	hSrch=FindFirstFile(path,&wfd);
	while (bResult)
	{
		if ( m_bStop == true ) return;
		_splitpath(path,drive,dir,NULL,NULL);
		if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
		{
			if (wfd.cFileName[0]!='.' && bFindRecursive == true)
			{
				wsprintf(newpath,"%s%s%s*.*",drive,dir,wfd.cFileName);
				ZFindFile(newpath, foundStorage, bFindRecursive);
			}
		}
		else
		{
			wsprintf(fname,"%s%s%s",drive,dir,wfd.cFileName);

			foundStorage.push_back(fname);
		}
		bResult=FindNextFile(hSrch,&wfd);
	}
	FindClose(hSrch);
}

32.5 delete recursive #

void DeleteRecursive(const std::string & strFolderName)
{
	HANDLE hSrch;
	WIN32_FIND_DATA wfd;
	//memset(&wfd, 0, sizeof(wfd));
	char fname[MAX_PATH] = { 0 };
	BOOL bResult=TRUE;
	char drive[_MAX_DRIVE] = { 0 };
	char dir[MAX_PATH] = { 0 };
	char newpath[MAX_PATH] = { 0 };

	hSrch=FindFirstFile(strFolderName.c_str(),&wfd);
	while (bResult)
	{
		_splitpath(strFolderName.c_str(),drive,dir,NULL,NULL);
		if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
		{
			if (wfd.cFileName[0]!='.' )
			{
				wsprintf(newpath,"%s%s%s*.*",drive,dir,wfd.cFileName);
				DeleteRecursive(newpath);
			}
		}
		else
		{
			wsprintf(fname,"%s%s%s",drive,dir,wfd.cFileName);
			DeleteFile(fname);
		}
		bResult=FindNextFile(hSrch,&wfd);
	}
	FindClose(hSrch);
}

void DeleteFolderRecursive(const std::string & strFolderName)
{
	if ( strFolderName[strFolderName.size()-1] == '')
	{
		_ASSERTE(!"마지막 캐릭터가 'W'가 될 수 없습니다.");
		return;
	}

	std::string strTemp = strFolderName;
	strTemp += "*.*";
	DeleteRecursive(strTemp);
	RemoveDirectory(strFolderName.c_str());
}

32.6 getURL from IE #


인터넷 익스플로러의 url 을 받아오는 코드. 인터넷 url 을 가져와서 특정 사이트를 차단하는 그런 프로그램에 유용함.

BOOL CALLBACK EnumChildProc(HWND hwnd, LPARAM lParam) 
{ 
	char sbufClass[100], sbufUrl[300]; 
	int nLenForUrl = 0; 

	cout << "EnumChildProc Called" << endl;

	GetClassName(hwnd, sbufClass, 100); 

	if( stricmp( sbufClass, "EDIT" ) == 0 ){ 
		nLenForUrl = ::SendMessage( hwnd, WM_GETTEXTLENGTH, 0, 0 ); 

		nLenForUrl = nLenForUrl + 1; 
		::SendMessage( hwnd, WM_GETTEXT, nLenForUrl, (LPARAM)sbufUrl ); 
		//AfxMessageBox(sbufUrl, MB_OK, 0); 
		cout << sbufUrl << endl;
	}
	return TRUE;
} 

void OnOk() 
{
	HWND hwnd; 
	WNDENUMPROC wndEnumProc = EnumChildProc; 
	char temp[200];
	char result[200] = { 0 };

	hwnd = ::FindWindow("Winamp v1.x", NULL); 

	if( hwnd != 0 )
	{
		int len = SendMessage(hwnd, WM_GETTEXTLENGTH, 0, 0);
		SendMessage(hwnd, WM_GETTEXT, len + 1, (LPARAM)temp);

		// . 을 찾는다. 
		for ( int i=0; i<len; i++)
		{
			if ( temp[i] == '.' ) break;
		}

		//strncpy(result, temp + i + 2, len - 12);
		
		//cout << result << endl;

		::EnumChildWindows( hwnd, wndEnumProc, 0L);
	}
	else
	{
		cout << "can't find" << endl;
	}
}

32.7 Win32 Resource Starting #


win32 로 시작할 때 Resource 를 이용한 시작 코드

#include "stdafx.h"
#include <windows.h>
#include "resource.h"

int CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);

int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance ,LPSTR lpszCmdParam,int nCmdShow)
{
	DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, WndProc);
	return 0;
}



int CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
	HDC hdc;
	PAINTSTRUCT ps;
	
	switch(iMessage)
	{
	case WM_INITDIALOG:
		return TRUE;

	case WM_COMMAND:
		{
			switch ( wParam )
			{
			case IDOK:
				PostQuitMessage(0);
				break;
			}
		}
		break;
		
	case WM_PAINT:
		hdc=BeginPaint(hWnd, &ps);
		EndPaint(hWnd, &ps);
		return 0;
	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
	}
	return FALSE;
}

32.8 How to Window Driver #

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dndevice/html/driverHowTo.asp

32.9 현재 프로그램의 hInstance 얻어오기 #

콘솔 프로그램에서 윈도우 띄울 때 많이 쓰인다고 함.
HINSTANCE hInst= GetModuleHandle(NULL); 

32.10 ListControl 에서 전체 row 선택하기 #

m_itemList.SetExtendedStyle(LVS_EX_FULLROWSELECT);

32.11 Debugging Tools for Windows 얻기 #


33 Visual Studio 가 만들어내는 파일 확장자 모음 #

Developer Studio가 생성하는 파일들에 대한 목록

파일 확장자 내용 
APS 리소스 파일에 대한 바이너리 파일. App Studio에서 리소스 파일을 로딩하는데 사용된다.(로딩 속도 향상) 
BSC 소스 브라우저 정보 파일(Browser database file). 이 파일은 BSCMAKER.EXE를 실행할 때 SBR파일로부터 생성된다. 
CLW 클래스위저드 상태 파일. 클래스위저드를 사용하여 추가되는 메시지 핸들링 함수 등과 관련된 정보들이 포함된다. 
DSP 메이크 파일(MAK)과 동일한 목적의 파일로 VC++5.0에서 사용한다. 
DSW 워크스페이스 파일 . 워크스페이스내의 각 프로젝트에 대한 엔트리 정보를 포함 한 파일 
PCH 프리컴파일 헤더 파일 (Precompiled header file). 이 파일은 컴파일 속도를 향상 시키며 컴파일 옵션/Yc, /Yu 또는 /YX를 사용할 때 생성된다. 
PDB 프로그램 정보 파일(Program database file). 이 바이너리 파일은 컴파일링, 링킹 과정을 통해 얻어지는 디버깅 정보를 포함한다. 
SBR 소스 브라우저 파일(Source browser file). 이 파일은 소스 파일에 대한 상세한 정보들이 포함된다. 
WSP Workspace information file(16비트 버전)은 통합 개발 환경이 종료될때의 상태 정보를 포함한다. 
VCP Workspace information file(VC++ 2.X버전 또는 이후버전)은 통합개발 환경이 종료될때의 상태 정보를 포함한다. 
EXP 익스포트 파일 (Export file). 익스포트되는 힘수와 데이터 정보를 포함한다. 
MAP 맵 파일(Map file). 프로그램의 엔트리 포인트, 심볼이름, 시작 주소, rlfdled 프로 그램에 링크된 정보를 포함한다. 
RES 리소스 파일(RC)이 컴파일된 바이너리 파일 
HPJ 문맥김지형 도움말 파일(Context-sensitive help project file). AppWizard 단계 4 에서 [Context-sensitive help]를 체크하면 자동 생성된다. 
NCB Parser information file. 이 파일은 클래스뷰와 컴포넌트 갤러리를 지원하기 위한 정보를 포함한다. 
MDP Microsoft Developer Studio file. 이 파일은 VC++ 2.X 버전에서 사용한 VCP파일 을 대체한다. 
RCT 리소스 템플릿 파일 (Resource template file) 
OPT 워크스페이스 환경설정을 보유 
PLG 빌드 로그 파일 


34 디버깅 환경 설정 하기 #


프로젝트 -> C/C++ -> 일반 -> 디버깅 정보 형식 : 프로그램 데이터베이스(/Zi) 로 한다. 만약 '편집하며 계속하기를 위한 프로그램 데이터 베이스(/ZI)' 를 선택하면 릴리즈 빌드에 편집하며 계속하기 기능에 필요한 추가적인 패팅(padding) 바이트가 포함되어 프로그램이 매우 커지고 느려질 것이다.


링커 속성에서 증분 링크를 사용 안하는 등 적절한 설정이 필요하다(/INCREMENTAL:NO, /DEBUG, /PDB, /NOLOGO(시작 배너 표시안함))


링커 -> 디버깅 -> 디버그 정보 생성 : 예(/DEBUG), 맵 파일 생성 : 예(/MAP), 맵 파일 이름 : 파일이름 설정(*.map), 맵 내보내기 : 예(/MAPINFO:EXPORTS), 맵 줄 : 예(/MAPINFO:LINES)


디버깅 심볼을 적절하게 얻기 위해서는 다음과 같이 한다.


링커 -> 최적화 -> 참조 : 참조하지 않는 데이터 제거(/OPT:REF), COMDAT 정리 사용 : 중복 COMDAT 제거(/OPT:ICF),


/RTC(런타임 오류 검사) : C/C++ -> 코드 생성 -> 작은 형식 검사 : Yes, 기본 런타임 검사 : Both, 버퍼 보안 검사 : Yes(/GS)

34.1 BugSlayer & Install Symbol Server #



http://msdn.microsoft.com/library/default.asp?url=/msdnmag/issues/02/06/bugslayer/toc.asp

35 윈도우 화면 보호기 끄고 켜기 #


윈도우가 화면 보호기를 시작할 때 다음과 같이 WM_SYSCOMMAND 에 SC_SCREENSAVE 메시지를 보내서 화면 보호기를 시작해도 되는지에 대한 질문을 한다. 이 때 0 을 return 하면 화면 보호기는 실행되지 않는다.

switch (msg)
{
    ....
    case WM_SYSCOMMAND:
        if (wParam == SC_SCREENSAVE)
            return 0;
        DefWindowProc(hWnd, message, wParam, lParam);
    ....
}



아래와 같은 코드를 이용해서 화면 보호기를 끄거나, 켤 수 있다.



//초기화 하실때 이 코드를 넣으면, 스크린세이버가 죽습니당.
SystemParametersInfo(SPI_SETSCREENSAVEACTIVE,
                         FALSE,
                         0,
                         SPIF_SENDWININICHANGE);

//그리고, 종료할때는 다음과 같이..
    SystemParametersInfo(SPI_SETSCREENSAVEACTIVE, 
                 TRUE,
                 0,
                 SPIF_SENDWININICHANGE);



36 mutex 를 이용하여 하나의 어플리케이션만 띄우기 #

	HANDLE hMutex; 

	// Create a mutex with no initial owner.

	hMutex = CreateMutex( 
		NULL,                       // no security attributes
		TRUE,                      // initially not owned
		"MyProgram");  // name of mutex

	if (hMutex == NULL || GetLastError() == ERROR_ALREADY_EXISTS) 
	{
		// Check for error.
		// 이미 같은 프로그램이 떠 있다.
		return 0;
	}

	// MainLoop
	// .....
	// .....

	// Release Mutex
	BOOL ret = ReleaseMutex(hMutex);

	ret = CloseHandle(hMutex);
	




37 윈도우 설치 후 기본 상태 #


37.1 윈도우98(English) #

  • DirectX : 4.05
  • IE : 4.0 - 4.72.3110 SP1a Cipher Strength : 40bit


  • 38 기타 #


    38.1 xp 의 익스프로러바 같은 UI 만들기 #



    38.2 #define WIN32_LEAN_AND_MEAN 의 의미 #



    .NET 2003 에서 만들어준 코드에 친절하게 한글로 적혀있었다. windows.h 를 include 하기 전에 define 을 해놓으면 거의 쓰이지 않는 코드의 선언을 막아준다는 것이다. 아무래도 적을 수록 컴파일러도 빠르고, 용량도 줄겠지...

    38.3 각종 무료 아이콘을 받을 수 있는 곳 #



    39 링크들 #