<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
	<channel>
		<title>J.K's Life And Story</title>
		<link>http://sanaigon.tistory.com/</link>
		<description>sanaigon@gmail.com</description>
		<language>ko</language>
		<pubDate>Mon, 30 Apr 2012 17:32:04 +0900</pubDate>
		<generator>Tistory 1.1 (http://www.tistory.com/)</generator>
		<managingEditor>J.K 스나이퍼</managingEditor>
		<image>
			<title>J.K's Life And Story</title>
			<url>http://cfs8.tistory.com/upload_control/download.blog?fhandle=YmxvZzE3NTA3OUBmczgudGlzdG9yeS5jb206L2F0dGFjaC8wLzEyLmpwZw%3D%3D</url>
			<link>http://sanaigon.tistory.com</link>
			<description>sanaigon@gmail.com</description>
		</image>
		<item>
			<title>[펌]DLL의 고급기법</title>
			<link>http://sanaigon.tistory.com/155</link>
			<description>&lt;DIV id=Blog1 class=&quot;widget Blog&quot;&gt;
&lt;DIV class=&quot;blog-posts hfeed&quot;&gt;
&lt;DIV class=date-outer&gt;
&lt;DIV class=date-posts&gt;
&lt;DIV class=post-outer&gt;
&lt;DIV class=&quot;post hentry&quot; itemtype=&quot;http://schema.org/BlogPosting&quot; itemscope=&quot;itemscope&quot;&gt;&lt;A name=7592607452206605758&gt;&lt;/A&gt;
&lt;H3 class=&quot;post-title entry-title&quot; itemprop=&quot;name&quot;&gt;DLL의 고급기법 &lt;/H3&gt;
&lt;DIV class=post-header&gt;
&lt;DIV class=post-header-line-1&gt;&lt;/DIV&gt;&lt;/DIV&gt;
&lt;DIV id=post-body-7592607452206605758 class=&quot;post-body entry-content&quot; itemprop=&quot;articleBody&quot;&gt;
&lt;P&gt;DLL의 고급기법&lt;/P&gt;
&lt;P&gt;1. 명시적인 DLL 모듈 로딩과 심벌링킹&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;DLL파일 이미지를 프로세스의 주소공간에 매핑하는 두가지 방법&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;첫째, 애플리케이션이 DLL에 포함되어 있는 심벌을 단순참조하는 경우, 운영체제의 로더가 필요한 DLL을 묵시적으로 로드한다. 
&lt;LI&gt;둘째, 애플리케이션이 필요한 DLL을 명시적으로 로드하는 것&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;1.1. 명시적인 DLL 모듈 로딩&lt;/P&gt;
&lt;P&gt;아래 두가지 함수중 하나를 이용하여 프로세스의 주소공간에 DLL을 매핑할 수 있다&lt;/P&gt;
&lt;BLOCKQUOTE style=&quot;MARGIN-RIGHT: 0px&quot; dir=ltr&gt;
&lt;P&gt;HMODULE LoadLibrary ( PCTSTR pszDLLPathName);&lt;/P&gt;
&lt;P&gt;HMODULE LoadLibraryEx( PCTSTR pszDLLPathName , HANDLE hFile , DWORD dwFlags );&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;이 함수들은 시스템에서 파일이미지를 검색하고 함수를 호출한 프로세스의 주소공간에 DLL파일이미지를 매핑하려고 시도한다. 두 함수는 파일 이미지가 매핑된 가상 메모리 주소를 나타내는 HOMODULE값을 반호나한다. HOMODULE형은 HINSTANCE형과 완전히 동일하며 상호간에 혼용되어 사용할 수 있다&lt;/P&gt;
&lt;P&gt;hFile&lt;/P&gt;
&lt;P&gt;미래에 사용하기 위해 예약된 변수로 반드시 NULL을 전달해야 한다.&lt;/P&gt;
&lt;P&gt;dwFlags&lt;/P&gt;
&lt;P&gt;DONT_RESOLVE_DLL_REFERENCES, LOAD_LIBRARY_AS_DATAFILE, LOAD_LIBRARY_AS_DATAFILE_EXCLUSIVE, LOAD_LIBRARY_AS_IMAGE_RESOURCE, LOAD_WITH_ALTERED_SEARCH_PATH, LOAD_IGNORE_CODE_AUTHZ_LEVEL 값을 가질 수 있다.&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;FONT color=#002fff&gt;DONT_RESOLVE_DLL_REFERENCES&lt;/FONT&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;이 플래그는 LoadLibraryEx함수를 호출하는 프로세스의 주소공간에 매핑할 것을 지정한다. 보통 dll이 프로세스의 주소공간에 매핑되면 시스템은 일반적으로 DllMain()이라고 불리는 특수한 함수를 호출하여 dll을 초기화하도록 한다. DONT_RESOLVE_DLL_REFERENCES 플래그를 사용하면 시스템은 DLL파일이미지가 매핑되는 작업까지만 수행하고 DllMain()함수는 호출하지 않는다. 또한 DLL 파일은 다른 DLL이 포함하고 있는 함수들을 임포트하기도 하는데, 시스템이 DLL을 프로세스 주소공간에 매핑할 때 다른 DLL이 필요한지를 확인하여 자동적으로 이러한 dll들을 로드해준다. &lt;FONT color=#002fff&gt;이 플래그를 사용하면 매핑할 DLL이 필요로 하는 추가적인 DLL을 프로세스의 주소공간에 자동으로 로드하지 않는다&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;DLL이 익스포트하고 있는 함수들은 내부적인 자료구조가 완전히 초기화되고 추가적으로 필요로 하는 DLL파일들이 로드되기 전까지는 호출될 수 없다. 따라서 가능하면 이플래그는 사용하지 않는 것이 좋다.&lt;/P&gt;
&lt;P&gt;잘못만들어진 플래그라고 한다(레이몬드첸의 블로그에서 확인, &lt;A href=&quot;http://blogs.msdn.com/oldnewthing/archive/2005/02/14/372266.aspx&quot;&gt;&lt;FONT color=#2288bb&gt;http://blogs.msdn.com/oldnewthing/archive/2005/02/14/372266.aspx&lt;/FONT&gt;&lt;/A&gt;)로 부터 &quot;LoadLibraryEx(DONT_RESOLVE_DLL_REFERENCES)는 완전히 잘못만들어졌다&quot;는 글을 살펴보기 바란다&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;FONT color=#002fff&gt;LOAD_LIBRARY_AS_DATAFILE&lt;/FONT&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;이 플래그는 마치 데이터 파일처럼 프로세스의 주소공간에 dll을 매핑하는 작업까지만 수행한다는 점에서 DONT_RESOLVE_DLL_REFERENCES 플래그와 유사하다. 이 플래그를 사용하면 시스템이 DLL파일을 초기화하기 위해 어떤 추가적인 작업도 수행하지 않는다. 예를 들어 시스템은 일반적으로 프로세스의 주소공간에 DLL을 매핑하고 나면 DLL의 정보를 확인하여 DLL파일 내의 각 섹션별로 어떤 페이지보호특성을 지정해야 할지를 결정하게 된다. 하지만 파일내에 실행코드가 포함되어 있더라도 이플래그를 사용하면 DLL정보를 이용한 페이지 보호 톡성 설정작업을 수행하지 않는다. &lt;/P&gt;
&lt;P&gt;DLL이 리소스만 가지고 있고 어떤 함수도 가지고 있지 않아서 DLL파일 이미지를 프로세스의 주소공간에 매핑하기만 하면 되는 경우에 유용하다. 일반적으로 exe파일은 새로운 프로세스를 수행하기 위해 로딩 되지만 LoadLibraryEx()함수를 이플래그와 함께 사용하면 exe파일 이미지를 프로세스의 주소공간에 단순매핑만 한다. 이렇게 exe파일을 매핑한 후 반환된 HMODULE을 이용하면 exe파일내에 포함되어 있는 리소스에 접근할 수 있다. exe 파일을 DllMain()을 가지고 있지 않기 때문에 LoadLibraryEx()함수를 이용하여 exe파일을 매핑하려는 경우에는 반드시 LOAD_LIBRARY_AS_DATAFILE 플래그를 사용해야 한다.&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;FONT color=#002fff&gt;LOAD_LIBRARY_AS_DATAFILE_EXCLUSIVE&lt;/FONT&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;이 플래그는 LOAD_LIBRARY_AS_DATAFILE과 유사하지만 바이너리 파일을 사용하는 동안 다른 애플리케이션이 해당 파일을 수정하지 못하도록 배타적으로 파일에 접근한다는 점에서 차이가 있다&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;FONT color=#002fff&gt;LOAD_LIBRARY_AS_IMAGE_RESOURCE&lt;/FONT&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;이 플래그는 LOAD_LIBRARY_AS_DATAFILE과 유사하지만 DLL파일을 로드할 때 운영체제가 상대가상주소(RVA)에 접근하는 방법에 있어 미세한 차이가 있다. 이 플래그를 사용하면 메모리 영역에 DLL을 로드한 후 각 심벌의 시작주소를 변경하지 않은 상태에서 RVA값에 직접적으로 접근할 수 있다. 이 플래그는 DLL의 포터블 익스큐터블 내의 여러 섹션들의 내용을 분석하고자 할때 유용하게 사용될 수 있다.&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;FONT color=#002fff&gt;LOAD_WITH_ALTERED_SEARCH_PATH&lt;/FONT&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;이 플래그를 사용하면 LoadLibraryEx() 함수가 시스템으로부터 DLL파일을 검색하는 알고리즘을 변경할 수 있다. 보통의 경우 LoadLibraryEx()함수는 기본적인 검색순서에 따라 파일을 찾게 되는데, LOAD_WITH_ALTERED_SEARCH_PATH를 사용하면 LoadLibraryEx()함수의 pszDLLPathName 매개변수로 어떻게 값을 전달하는 가에 따라 서로다른 세가지 방법으로 파일을 검색하게 된다.&lt;/P&gt;
&lt;P&gt;방법1) pszDLLPathName에 파일명만 전달하면 기본검색순서를 따른다&lt;/P&gt;
&lt;P&gt;방법2) pszDLLPathName이 절대경로인 경우 검색하지않고 해당 파일을 로드하려고 한다.&lt;/P&gt;
&lt;P&gt;방법3) pszDLLPathName이 상대경로인 경우 다음과 같이 상대경로로 검색한다.&lt;/P&gt;
&lt;P&gt;예) pszDLLPathName이 &quot;..\\a.dll&quot; 인 경우&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;프로세스의 현재디렉토리의 상위폴더 
&lt;LI&gt;윈도우 시스템 디렉토리의 상위폴더(즉, 윈도우 디렉토리) 
&lt;LI&gt;16비트 시스템 디렉토리의 상위폴더 
&lt;LI&gt;윈도우 디렉토리의 상위폴더(일반적으로 볼륨의 루트) 
&lt;LI&gt;PATH환경변수에 포함되어 있는 디렉토리의 상위폴더&lt;/LI&gt;&lt;/OL&gt;
&lt;P&gt;애플리케이션을 개발하는 시점에는 모든 DLL파일들이 이미 잘 알려진 폴더로부터 로드될 것으로 가정하기 때문에 특정 위치로 부터 DLL파일들을 로드하려 한다면 LoadLibraryEx() 함수에 LOAD_WITH_ALTERED_SEARCH_PATH 플래그를 전달하는 방식이나, 애플리케리션의 현재 디렉토리를 변경하는 방식을 사용하기 보다는 SetDllDirectory()함수를 이용하여 DLL파일들을 로드할 위치를 지정하는 것이 좋다. 이 함수를 사용하면 LoadLibrary,LoadLibraryEx()함수는 다음과 같은 위치에서 해당파일을 검색하게 된다.&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;애플리케이션을 포함하고 있는 폴더 
&lt;LI&gt;SetDllDirectory()에 의해 지정된 폴더 
&lt;LI&gt;윈도우 시스템 디렉토리의 상위폴더(즉, 윈도우 디렉토리) 
&lt;LI&gt;16비트 시스템 디렉토리의 상위폴더 
&lt;LI&gt;윈도우 디렉토리의 상위폴더(일반적으로 볼륨의 루트) 
&lt;LI&gt;PATH환경변수에 포함되어 있는 디렉토리의 상위폴더&lt;/LI&gt;&lt;/OL&gt;
&lt;P&gt;SetDllDirectory()함수를 이용하면 애플리케이션의 현재디렉토리로 부터 동일한 파일명을 가진 다른 DLL파일들을 로드할 위험없이 애플리케이션과 공유 DLL파일을 지정한 디렉토리 내에 체계적으로 저장해 둘 수 있다. &lt;/P&gt;
&lt;P&gt;SetDllDirectory(&quot;&quot;)를 호출하면 (빈문자열 전달) 현재 디렉토리로 부터 파일을 검색하지 않는다. 만일 NULL을 전달하면 기본검색 알고리즘을 이용한다. &lt;/P&gt;
&lt;P&gt;GetDllDirectory()를 호출하면 지정된 디렉토리를 가져올 수 있다.&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;FONT color=#002fff&gt;LOAD_IGNORE_CODE_AUTHZ_LEVEL&lt;/FONT&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;LOAD_IGNORE_CODE_AUTHZ_LEVEL 플래그를 사용하면 실행 중 코드권한 제어를 위해 윈도우 XP에서부터 소개된 WinSafer(소프트웨어 제한 정책)의 검증 기능을 사용하지 않게 된다. 이 기능은 윈도우 비스타의 사용자 계정 컨트롤(UAC)에 의해 흡수되었다.&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;2. 명시적인 DLL 모듈 언로딩&lt;/P&gt;
&lt;P&gt;프로세스 내의 스레드에서 더이상 DLL파일내의 심벌을 사용할 필요가 없으면 FreeLibrary()함수를 호출하여 프로세스의 주소공간으로 부터 DLL파일을 명시적으로 언로드 할 수 있다.&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;DIV style=&quot;BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 10px; BACKGROUND-COLOR: #f4f4f4; PADDING-LEFT: 10px; PADDING-RIGHT: 10px; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 10px&quot;&gt;BOOL FreeLibrary ( HMODULE hInstDll);&lt;br /&gt;BOOL FreeLibraryAndExitThread ( HMODULE hInstDll, DWORD dwExitCode);&lt;br /&gt;&lt;/DIV&gt;
&lt;P&gt;&lt;br /&gt;&lt;/P&gt;
&lt;P&gt;FreeLibraryAndExitThread() 함수내부에서는 결국 FreeLibrary() 및 ExitThread()를 순차적으로 호출하고 있을텐데 마이크로 소프트가 구지 이런 함수를 왜 만들었는지 의아해 할 것이다. 이 함수가 추가된 이유는 다음과 같은 시나리오에 활용하기 위함이다. &lt;/P&gt;
&lt;P&gt;프로세스의 주소공간에 매핑되어 스레드를 생성하는 DLL이 있다고 가정해보자. 스레드가 적업을 마치면 프로세스 주소강간으로부터 DLL매핑을 해제하기 위해 FreeLibrary()를 호출한 후 ExitThread()함수를 호출해야 한다. 하지만 FreeLibrary()와 ExitThread() 함수를 각각 호출하면 심각한 문제가 발생한다. 문제는 FreeLibrary() 함수를 호출하면 프로세스의 주소공간으로부터 DLL파일이 지체없이 해제되어 버린다는데 있다. FreeLibrary()가 반환하면 ExitThread() 함수를 호출하고자 했던 코드를 더이상 메모리상에 남지 않게 되므로 스레드가 수행할 코드가 사라지게 된다.이렇게 되면 접근 위반이 발생하고 이는 전체프로세스의 종료로 이어진다.&lt;/P&gt;
&lt;P&gt;하지만 스레드가 FreeLibraryAndExitThread()함수를 호출하면 임하수는 FreeLibrary() 함수를 호출하여 DLL을 지체없이 해제하더라도 다음에 수행할 코드는 해제된 DLL파일내에 존재하는 것이 아니라 Kernel32.dll 파일내에 존재하게 된다. 따라서 스레드는 지속적으로 수행될 수 있으며 ExitThread()함수를 호출할 수 있다. &lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;DLL은 여러번 Load한다고 해서 메모리에 자꾸 올리는 것이 아니라 DLL참조카운트를 증가한다. 이 참조카운트 값만큰 Free해주어야 한다.&lt;/P&gt;
&lt;P&gt;스레드는 GetModuleHandle() 함수를 호출하여 특정 DLL파일이 프로세스 주소공간에 매핑되어 있는지를 확인할 수 있다.&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;DIV style=&quot;BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 10px; BACKGROUND-COLOR: #f4f4f4; PADDING-LEFT: 10px; PADDING-RIGHT: 10px; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 10px&quot;&gt;DWORD GetModuleHandle(HMODULE hInstModule );&lt;br /&gt;&lt;br /&gt;HMODULE hInstDll = GetModuleHandle(TEXT(&quot;MyLib&quot;));&lt;br /&gt;if ( hInstDll == NULL )&lt;br /&gt;{&lt;br /&gt;// MyLib.dll 파일이 로드되지 않은 상태&lt;br /&gt;hInstDll = LoadLibrary(TEXT(&quot;MyLib&quot;));&lt;br /&gt;}&lt;br /&gt;&lt;/DIV&gt;
&lt;P&gt;&lt;br /&gt;GetModuleHandle()에 NULL을 전달하면 애플리케이션 실행모듈에 대한 핸들을 얻을 수 있다.&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;DLL파일에 대한 HMODULE값을 알고 있다면 GetModuleFileName() 함수를 호출하여 DLL(혹은 exe)파일에 대한 전체 경로명을 알 수 있다.&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;DIV style=&quot;BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 10px; BACKGROUND-COLOR: #f4f4f4; PADDING-LEFT: 10px; PADDING-RIGHT: 10px; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 10px&quot;&gt;DWORD GetModuleFileName (&lt;br /&gt;HMODULE hInstModule , &lt;br /&gt;PTSTR pszPathName ,&lt;br /&gt;DWORD cchPath );&lt;br /&gt;&lt;/DIV&gt;
&lt;P&gt;&lt;br /&gt;hInstModule&lt;/P&gt;
&lt;P&gt;DLL의 HMODULE값&lt;/P&gt;
&lt;P&gt;pszPathName&lt;/P&gt;
&lt;P&gt;파일 이미지에 대한 전체 경로명을 저장할 버퍼의 주소&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;hInstModule값으로 0을 전달하면 현재 실행중인 애플리케이션의 전체경로명을 알 수 있다.&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;3. 익스포트된 심벌을 명시적으로 링킹하기&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;스레드가 DLL을 명시적으로 로드하였다면 이제 GetProcAddress()함수를 호출하여 익스포트된 심벌에 대한 시작주소를 얻어와야 한다.&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;DIV style=&quot;BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 10px; BACKGROUND-COLOR: #f4f4f4; PADDING-LEFT: 10px; PADDING-RIGHT: 10px; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 10px&quot;&gt;
&lt;P&gt;FARPROC GetProcAddress (&lt;/P&gt;
&lt;P&gt;HMODULE hInstDll , &lt;/P&gt;
&lt;P&gt;PCSTR pszSymbolName );&lt;br /&gt;&lt;/P&gt;&lt;/DIV&gt;
&lt;P&gt;&lt;br /&gt;hInstDll&lt;/P&gt;
&lt;P&gt;모듈의 핸들&lt;/P&gt;
&lt;P&gt;pszSymbolName&lt;/P&gt;
&lt;P&gt;익스포트된 심벌의 이름 (또는 순차적인 숫자)&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;pszSymbolName 매개변수에 익스포트된 심벌의 이름을 전달하면 심벌의 주소값을 리턴한다&lt;/P&gt;
&lt;P&gt;예)&lt;/P&gt;
&lt;P&gt;FARPROC pfn = GetProcAddress(hInstDll, &quot;SomeFuncInDll&quot;);&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;pszSymbolName 매개변수에 심벌의 순차적인 숫자를 전달 할 수도 있다. 이러한 벙법을 사용하려면 DLL개발자가 해당 심벌이름에 &quot;2&quot;라는 숫자값을 할당하였음을 알고 있어야 할 것이다. 마이크로소프트는 이처럼 숫자값을 이용하는 방법을 더이상 사용하지 말것을 강조한다.&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;2. DLL의 진입점 함수&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;DLL은 하나의 진입점 함수를 가질 수 있다. 진입점 함수는 시스템에 의해 여러번 호출될 수 있는데, DLL이 프로세스별로 혹은 스레드별로 초기화를 수행하거나 정리할 목적으로 사용되기도 한다 DLL을 구현할 때 진입점 함수를 반드시 구현해야 하는 것은 아니다. 예를 들어 리소스만들 가지고 있는 DLL파일을 만드는 경우라면 진입점 함수를 구현할 필요가 없다.&lt;/P&gt;
&lt;P&gt;하지만 DLL파일이 추가적인 정보들을 통지 받아야 하는 경우라면 다음과 같이 진입점 함수를 구현하면 된다.&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;DIV style=&quot;BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 10px; BACKGROUND-COLOR: #f4f4f4; PADDING-LEFT: 10px; PADDING-RIGHT: 10px; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 10px&quot;&gt;BOOl WINAPI DllMain(HINSTANCE hInstDll, DWORD fdwReason, PVOID fImpLoad) {&lt;br /&gt;switch(fdwReason) &lt;br /&gt;{&lt;br /&gt;case DLL_PROCESS_ATTACH :&lt;br /&gt;// DLL이 프로세스의 주소공간에 매핑되고 있다.&lt;br /&gt;break;&lt;br /&gt;case DLL_THREAD_ATTACH :&lt;br /&gt;// 스레드가 생성되고 있다.&lt;br /&gt;break;&lt;br /&gt;case DLL_THREAD_DETACH:&lt;br /&gt;// 스레드가 깨끗하게 종료중이다.&lt;br /&gt;break;&lt;br /&gt;case DLL_PROCESS_DETACH:&lt;br /&gt;// DLL이 프로세스의 주소 공간에서 매핑해제 되고 있다.&lt;br /&gt;break;&lt;br /&gt;}&lt;br /&gt;return (TRUE); // DLL_PROCESS_ATTACH 의 경우에만 사용된다.&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/DIV&gt;
&lt;P&gt;&lt;br /&gt;hInstDll&lt;/P&gt;
&lt;P&gt;DLL의 인스턴스 핸들 값, DLL 파일 이미지가 가상 주소공간의 어디로 매핑되었는지를 알려주는 가상 메모리 주소값이다. 보통의 경우 이 값을 전역변수에 저장해 두었다가 DialogBoz나 LoadString과 같이 리소스를 로드해야 하는 함수들을 호출할때 사용하는 것이 일반적이다. &lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;fImpLoad&lt;/P&gt;
&lt;P&gt;DLL이 암시적으로 로드된 경우에는 0이 아닌 값이 전달되고, DLL이 명시적으로 로드된 경우에는 0이 전달된다.&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;fdwReason&lt;/P&gt;
&lt;P&gt;시스템이 이 함수를 호출한 이유를 나타내는 값이 전달된다. 이 이 매개변수로는 DLL_PROCESS_ATTACH,DLL_PROCESS_DETACH,DLL_THREAD_ATTACH,DLL_THREAD_DETACH 값이 올 수 있다.&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;DLL은 자기 자신을 초기화 하기 위해 DllMain()함수를 사용한다는 것을 기억하라.&lt;/P&gt;
&lt;P&gt;특정 DLL에 대해 DllMain()함수가 호출된 시점에 동일 주소공간에 로드된 다른 DLL들은 자신의 DllMain()함수를 미처 호출하지 못했을 수도 있다. 다른 DLL들은 아직 초기화 되지 않은 상태일 수도 있으므로 DllMain()함수에서 다른 DLL이 익스포트하고 있는 함수를 호출해서는 안된다. 또한 DllMain() 내에서는 LoadLibrary(Ex)나 FreeLibrary와 같은 함수를 호출해서도 안되는데 만일 이러한 함수를 호추랗면 여러 DLL들 사이에 의존관계 루프가 생길 수 있다.&lt;/P&gt;
&lt;P&gt;플랫폼 SDK문서에는 DllMain()함수를 TLS,커널오브젝트생성,파일열기 작업 수행 등의 초기화를 위해서만 활용할 것을 명기하고 있다. 또한 User, Shell,ODBC, COM,RPC,소켓함수 등을 호출해서는 안된다. 왜냐하면 이러한 함수들을 호출할였을때 해당 함수들의 기능을 구현하고 있는 DLL들이 아직 초기화되지 못했을 수도 있고, 해당 기능을 수행하는 함수들이 내부적으로 LoadLibrary(Ex) 함수를 호출하는 경우 의존 관계 로프가 생길수도 있기 때문이다.&lt;/P&gt;
&lt;P&gt;또한 전역이나 정적으로 선언된 C++오브젝트를 생성하는 것도 이와 유사한 문제를 야기할 수 있음을 알아두어야 한다. 왜냐하면 이러한 오브젝트들의 생성자와 파괴자가 우리가 작성한 DllMain()함수가 호출되는 시점에 동시에 수행될 수도 있기 때문이다.&lt;/P&gt;
&lt;P&gt;DllMain()진입점 함수가 호출되었을 때 프로세스가 멈춰버리는 것과 같은 이상증상을 피하기 위한 추가적인 제한 사항을 알고 있다면&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;/DIV&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;div style='text-align: center; margin: 10px auto; height: 91px; overflow: hidden; clear: both;'&gt;&lt;iframe title='mixUP 위젯' src='http://mixsh.com/widget/new_mixup/loader_plugin.html?domain=sanaigon.tistory.com&amp;media_type=10&amp;guid=sanaigon.tistory.com%2F155&amp;regts=1335774599&amp;showhitcnt=1&amp;platform=10' frameBorder='0' scrolling='no' allowTransparency='true' width='402' height='130'&gt;&lt;/iframe&gt;&lt;/div&gt;</description>
			<category>Windows Programming (MFC)</category>
			<author>J.K 스나이퍼</author>
			<guid>http://sanaigon.tistory.com/155</guid>
			<comments>http://sanaigon.tistory.com/155#entry155comment</comments>
			<pubDate>Mon, 30 Apr 2012 17:29:59 +0900</pubDate>
		</item>
		<item>
			<title>PNG 이미지를 가진 Resource ID로 HBitmap 얻기</title>
			<link>http://sanaigon.tistory.com/154</link>
			<description>&lt;P&gt;&lt;br /&gt;
&lt;FONT color=#000000&gt;PNG이미지를 사용하기 위해서는 PNG파일을 Bitmap으로 메모리 상으로 로드 한 다음 메모리 상에서는 Bitmap이미지를 사용하듯이 사용해야 한다. &lt;br /&gt;
&lt;br /&gt;하지만 이런 작업을 하려면 PNG이미지를 로드 해서 Bitmap 핸들 즉 HBITMAP 을 얻어와야 하는데, 일반적인 Bitmap을 다루는 클래스나 함수에서는 PNG의 Resource ID를 사용할수가 없다. &lt;br /&gt;
&lt;br /&gt;그러므로 우선 PNG 이미지를 CImage 클래스를 이용해 로드를 한 후 CImage 클래스의 Detach()함수를 사용해 Detatch()에서 반환하는 HBITMAP을 가지고&amp;nbsp;비트맵 이미지 다루듯이 다룰 수 있다. &lt;br /&gt;
&lt;br /&gt;CImage에 PNG 이미지를 로드 하는 방법은 파일일 경우는 CImage클래스의 Load(&amp;nbsp;LPCTSTR&lt;STRONG&gt; &lt;/STRONG&gt;&lt;SPAN class=parameter&gt;pszFileName&lt;/SPAN&gt; ); 함수를 써서 PNG이미지의 Full Path를 써주면 곧 바로 CImage 객체에 PNG이미지가 로드가 된다. &lt;br /&gt;
&lt;br /&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;DIV style=&quot;BORDER-BOTTOM: #fe8943 3px double; BORDER-LEFT: #fe8943 3px double; PADDING-BOTTOM: 10px; BACKGROUND-COLOR: #fedec7; PADDING-LEFT: 10px; PADDING-RIGHT: 10px; BORDER-TOP: #fe8943 3px double; BORDER-RIGHT: #fe8943 3px double; PADDING-TOP: 10px&quot; class=txc-textbox&gt;&lt;STRONG&gt;&lt;FONT color=#000000&gt;// File Path을 이용하여 PNG이미지를 CImage 클래스에 로드 하는 경우 &lt;/FONT&gt;&lt;/STRONG&gt;
&lt;P&gt;&lt;FONT color=#000000&gt;CImage&amp;nbsp;cPNGImage;&lt;br /&gt;
&amp;nbsp;HRESULT&amp;nbsp; hRes = S_OK;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#000000&gt;&lt;STRONG&gt;&amp;nbsp;hRes = cPNGImage.Load( _ptszFilePath );&lt;/STRONG&gt;&lt;br /&gt;
&amp;nbsp;if( hRes != S_OK )&lt;br /&gt;
&amp;nbsp;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;return NULL;&lt;br /&gt;
&amp;nbsp;}&lt;br /&gt;
&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#000000&gt;// Bitmap 핸들을 얻는다. &lt;br /&gt;
&lt;STRONG&gt;HBITMAP hBitmap&amp;nbsp; = cPNGImage.Detach();&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;/DIV&gt;&lt;br /&gt;
&lt;FONT color=#000000&gt;PNG File path를 이용하는 경우는 위에 처럼 간단 하지만&lt;br /&gt;
문제는 Resource ID를 이용해서 로드 하는 경우 이다. &lt;br /&gt;
&lt;br /&gt;제품이 설치된 환경에서 PNG이미지를 노출하고 싶지 않은 경우 프로젝트에 Resource로 로드 한 후 이미지 파일과 함께 빌드된 상태로 제품이 나가고자 한다면 PNG이미지를 프로젝트의 Resource의 한 형태로 놓을 수 밖에 없는데 위와 같이 File path로 Load()를 하는 방식은 무의미 하기 때문이다. &lt;br /&gt;
&lt;br /&gt;MSDN에 CImage의 Load()함수를 살펴보면 위와 같이 File path를 받는 방식 이외에 아래와 같이 다른 방식이 있따. &lt;br /&gt;
&lt;br /&gt;&lt;/FONT&gt;
&lt;DIV style=&quot;BORDER-BOTTOM: #fe8943 3px double; BORDER-LEFT: #fe8943 3px double; PADDING-BOTTOM: 10px; BACKGROUND-COLOR: #fedec7; PADDING-LEFT: 10px; PADDING-RIGHT: 10px; BORDER-TOP: #fe8943 3px double; BORDER-RIGHT: #fe8943 3px double; PADDING-TOP: 10px&quot; class=txc-textbox&gt;&lt;STRONG&gt;&lt;FONT color=#000000&gt;HRESULT Load( IStream* &lt;SPAN class=parameter&gt;pStream&lt;/SPAN&gt;) throw();&lt;br /&gt;
&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/DIV&gt;
&lt;P&gt;&lt;br /&gt;
&lt;FONT color=#000000&gt;위의 함수는 Stream객체를 이용한 로드 방식인데 Input Stream 포인터를 이용한 로드 방식인데, 이 Input Stream 포인터를 이용하면 수동적으로 PNG이미지를 메모리에 로드를 시킨 후 메모리에 접근 할 수 있는 포인터를 넘겨 주어 HBITMAP을 얻을 수 있다. &lt;br /&gt;
&lt;br /&gt;사용 예는 아래와 같다. &lt;br /&gt;
&lt;br /&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;DIV style=&quot;BORDER-BOTTOM: #fe8943 3px double; BORDER-LEFT: #fe8943 3px double; PADDING-BOTTOM: 10px; BACKGROUND-COLOR: #fedec7; PADDING-LEFT: 10px; PADDING-RIGHT: 10px; BORDER-TOP: #fe8943 3px double; BORDER-RIGHT: #fe8943 3px double; PADDING-TOP: 10px&quot; class=txc-textbox&gt;&lt;FONT color=#000000&gt;CImage&amp;nbsp;cPngImage; &lt;/FONT&gt;
&lt;P&gt;&lt;FONT color=#000000&gt;&amp;nbsp;HMODULE&amp;nbsp;hModule = AfxGetInstanceHandle();&lt;br /&gt;
&amp;nbsp;HRESULT hRes&amp;nbsp;= S_OK;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#000000&gt;&lt;STRONG&gt;&amp;nbsp;// Resource 핸들찾기 &lt;br /&gt;
&lt;/STRONG&gt;&amp;nbsp;HRSRC&amp;nbsp;src&amp;nbsp;&amp;nbsp;= FindResource(hModule, MAKEINTRESOURCE( _nResourceID ), _T(&quot;PNG&quot;) );&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#000000&gt;&lt;STRONG&gt;&amp;nbsp;// Resource를 Global 메모리에 로드 시킨다. &lt;br /&gt;
&lt;/STRONG&gt;&amp;nbsp;HGLOBAL&amp;nbsp;hGlobal = LoadResource( hModule, src );&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#000000&gt;&lt;STRONG&gt;&amp;nbsp;// Global 메모리에 로드 시킨 Resource 메모리에 적급하기 위한 Lock&lt;br /&gt;
&lt;/STRONG&gt;&amp;nbsp;PVOID pResourceData = LockResource(hGlobal);&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#000000&gt;&lt;STRONG&gt;&amp;nbsp;// Resource의 Size&lt;br /&gt;
&lt;/STRONG&gt;&amp;nbsp;INT&amp;nbsp;&amp;nbsp; nSize&amp;nbsp;&amp;nbsp;&amp;nbsp;= SizeofResource( hModule, src );&amp;nbsp; &lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#000000&gt;&amp;nbsp;IStream *pStream&amp;nbsp;&amp;nbsp;= NULL;&amp;nbsp;// 이미지 파일의 stream pointer&lt;br /&gt;
&amp;nbsp;DWORD&amp;nbsp; dwReadWrite&amp;nbsp;= 0;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#000000&gt;&lt;STRONG&gt;&amp;nbsp;// Global Memory에 접근할 IStream object를 만든다. &lt;br /&gt;
&lt;/STRONG&gt;&amp;nbsp;CreateStreamOnHGlobal( NULL, TRUE, &amp;amp;pStream );&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#000000&gt;&lt;STRONG&gt;&amp;nbsp;// IStream object에 리소스 데이터를 쓴다. &lt;br /&gt;
&lt;/STRONG&gt;&amp;nbsp;pStream-&amp;gt;Write( pResourceData, nSize, &amp;amp;dwReadWrite );&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#000000&gt;&lt;STRONG&gt;&amp;nbsp;// CImage 객체에 로드 시킨다. &lt;br /&gt;
&lt;/STRONG&gt;&amp;nbsp;hRes = cPngImage.Load( pStream );&lt;br /&gt;
&amp;nbsp;if( hRes != S_OK )&lt;br /&gt;
&amp;nbsp;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;return NULL;&lt;br /&gt;
&amp;nbsp;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;FONT color=#000000&gt;HBITMAP hBitmap = cPNGImage.Detach();&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/P&gt;&lt;/DIV&gt;&lt;br /&gt;
&lt;FONT color=#000000&gt;위의 소스를 보면 Resource Type중 &quot;PNG&quot;로 되어있는 리소스의 ID를 입력받아 리소스의 핸들을 얻은 다음,&lt;br /&gt;
이렇게 얻은 리소스를 Global memory에 로드를 시키고 접근하기 위해 Lock을 건다. &lt;br /&gt;
&lt;br /&gt;Global Memory에 접근할 IStream object를 CreateStreamOnHGlobal()를 사용하여 생성 한후 &lt;br /&gt;
IStream object에 Resource의 데이터를 Resource size만큼 쓴다. &lt;br /&gt;
&lt;br /&gt;이렇게 Resource 데이터를 IStream object에 전부 썼다면, CImage클래스의 Load()함수에 이 IStream 포인터를 넘겨주어 PNG이미지를 CImage클래스에 로드 할수가 있고, 이렇게 로드한 CImage 객체의 Detach()를 이용해 HBITMAP 핸들을 얻어서 사용 할 수가 있는 것이다. &lt;br /&gt;
&lt;br /&gt;이렇게 Resource로 로드된 PNG이미지를 이용한다면 로드 방법 때문에 용량이 큰 Bitmap Resource를 사용하지 않더라고 충분히 이미지를 로드해서 쓸수 있다. &lt;br /&gt;
&lt;/FONT&gt;&lt;div class=&quot;blogger-news-widget&quot; style=&quot;width: 100%; text-align: center&quot;&gt;
		  					&lt;embed src=&quot;http://api.v.daum.net/static/recombox1.swf&quot; quality=&quot;high&quot; flashvars=&quot;nid=27177004&quot; allowscriptaccess=&quot;always&quot; allowfullscreen=&quot;false&quot; bgcolor=&quot;#ffffff&quot; width=&quot;400&quot; height=&quot;80&quot; type=&quot;application/x-shockwave-flash&quot; wmode=&quot;transparent&quot;&gt;&lt;/embed&gt;
						&lt;/div&gt;&lt;div style='text-align: center; margin: 10px auto; height: 91px; overflow: hidden; clear: both;'&gt;&lt;iframe title='mixUP 위젯' src='http://mixsh.com/widget/new_mixup/loader_plugin.html?domain=sanaigon.tistory.com&amp;media_type=10&amp;guid=sanaigon.tistory.com%2F154&amp;regts=1332404086&amp;showhitcnt=1&amp;platform=10' frameBorder='0' scrolling='no' allowTransparency='true' width='402' height='130'&gt;&lt;/iframe&gt;&lt;/div&gt;</description>
			<category>Windows Programming (MFC)</category>
			<author>J.K 스나이퍼</author>
			<guid>http://sanaigon.tistory.com/154</guid>
			<comments>http://sanaigon.tistory.com/154#entry154comment</comments>
			<pubDate>Thu, 22 Mar 2012 17:13:58 +0900</pubDate>
		</item>
		<item>
			<title>[Android] AsyncTask클래스에 대한 간단 내용 정리</title>
			<link>http://sanaigon.tistory.com/153</link>
			<description>AsyncTask 는 말 그대로 비동기 적으로 Android 내에서의 Thread를 대신해 background에서 작업을 수행할수 있도록 해주는 클래스 이다. &lt;br /&gt;
&lt;br /&gt;AsysncTask는 3가지 generic 한 type에 의해 정의 되는데 형태는 아래와 같다. &lt;br /&gt;
&lt;br /&gt;&lt;STRONG&gt;&lt;FONT style=&quot;BACKGROUND-COLOR: #ffffff&quot; color=#000000&gt;&lt;SPAN style=&quot;FONT-SIZE: 12pt&quot;&gt;AsyncTask&amp;lt;Params, Progress, Result&amp;gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;br /&gt;
&lt;/STRONG&gt;&lt;br /&gt;
각각의 맞는 형태의 자료형을 넣어주며 된다. 간단하게 Progress bar의 증가 여부를 보여주고자 할때는 &lt;br /&gt;
Integer형태만을 사용하므로 AsyscTask&amp;lt;Integer, Integer, Integer&amp;gt;의 형태로 클래스를 상속받으면 된다. &lt;br /&gt;
&lt;br /&gt;AsyncTask의 재정의 해야 하는 메소드인 doInBackground() 메소드에 background로 돌아가야 하는 작업을 정의 해 놓고 &lt;br /&gt;
Main Thread에서 AsyncTask 객체의 execute()메소드를 호출하면 doInBackground()안의 정의된 내용이 수행되게 된다.&amp;nbsp;&lt;br /&gt;
&lt;br /&gt;AsyncTask객체의 execute()함수 호출시 일어나는 과정은 다음과 같은 4가지 절차에 따라 수행된다. &lt;br /&gt;
&lt;br /&gt;&lt;STRONG&gt;1. onPreExecute()&lt;/STRONG&gt;&lt;br /&gt;
AsyncTask클래스의 메소드로서 execute()되기 전에 Main Thread에 의해 호출된다. &lt;br /&gt;
주로&amp;nbsp;Main Thread의 UI의 초기화 작업을 넣는데 사용한다. &lt;br /&gt;
&lt;br /&gt;&lt;STRONG&gt;2. doInBackground(Params...)&lt;/STRONG&gt;&lt;br /&gt;
이 메소드에서는 오랜시간 걸리는 작업을 백그라운드로 수행하고자 하는 작업내용을 정의 한다. &lt;br /&gt;
예를 들어 Progress bar의 진행도 계산이 값의 변화를 계속 일어나는 부분들에 대한 작업이 들어간다. &lt;br /&gt;
&lt;br /&gt;작업 도중 Main Thread의 UI객체에 접근을 하거나, 계산된 내용의 업데이트가 필요한 경우 메소드 내에서 &lt;br /&gt;
&lt;STRONG&gt;publishProgress(Progress...)&lt;/STRONG&gt; 함수를 호출한다. &lt;br /&gt;
&lt;br /&gt;publishProgress(Progress...) 메소드를 호출하게 되면 아래의 3번 스텝이 중간중간 실행 되게 된다. &lt;br /&gt;
&lt;br /&gt;&lt;STRONG&gt;3. onProgressUpdate(Progress...) &lt;br /&gt;
&lt;/STRONG&gt;이 메소드는 doInBackground()함수 내에서 처리된 작업 중에 publishProgress()메소드 호출에 따라 중간중간 계산된 값을 &lt;br /&gt;
UI에 표시되야 할 필요가 있을 경우 해당되는 작업 처리 내용을 정의 하는 메소드 이다. &lt;br /&gt;
예를 들어 Progress bar의 position 증가를 하고 값을 보여주는 일을 하고자 할 경우에 해당한다. &lt;br /&gt;
&lt;br /&gt;&lt;STRONG&gt;4. onPostExecute(Result)&lt;br /&gt;
&lt;/STRONG&gt;background로 한 작업들이 모두 끝나고 호출되는 함수 이다. &lt;br /&gt;
최종 결과 값을 UI에 보여주고자 할때 쓰인다. &lt;br /&gt;
&lt;br /&gt;좀 더 자세한 내용을 확인하고자 한다면 아래의 링크에서 참조하길 바란다. &lt;br /&gt;
&lt;A href=&quot;http://developer.android.com/reference/android/os/AsyncTask.html&quot;&gt;http://developer.android.com/reference/android/os/AsyncTask.html&lt;/A&gt;&lt;br /&gt;
&lt;br /&gt;&lt;div style='text-align: center; margin: 10px auto; height: 91px; overflow: hidden; clear: both;'&gt;&lt;iframe title='mixUP 위젯' src='http://mixsh.com/widget/new_mixup/loader_plugin.html?domain=sanaigon.tistory.com&amp;media_type=10&amp;guid=sanaigon.tistory.com%2F153&amp;regts=1332292494&amp;showhitcnt=1&amp;platform=10' frameBorder='0' scrolling='no' allowTransparency='true' width='402' height='130'&gt;&lt;/iframe&gt;&lt;/div&gt;</description>
			<category>Android</category>
			<author>J.K 스나이퍼</author>
			<guid>http://sanaigon.tistory.com/153</guid>
			<comments>http://sanaigon.tistory.com/153#entry153comment</comments>
			<pubDate>Wed, 21 Mar 2012 10:14:54 +0900</pubDate>
		</item>
		<item>
			<title>안드로이드의 LayoutInflater에 대한 개념 정리</title>
			<link>http://sanaigon.tistory.com/152</link>
			<description>Inflate의 사전전인 의미는 올리다, 부풀리다 팽창 시키다라는 의미이다. &lt;br /&gt;
&lt;br /&gt;&lt;SPAN style=&quot;FONT-SIZE: 14pt&quot;&gt;&lt;STRONG&gt;Inflation의 정의 &lt;/STRONG&gt;&lt;/SPAN&gt;&lt;br /&gt;
&lt;br /&gt;안드로이드 내에서으 Inflation의 의미는 XML 레이아웃에 정으 된 내용이 메모리 상에 객체화 되는 과정을 Inflation이라고 한다. &lt;br /&gt;
Inflation의 기능은 말대로&amp;nbsp;XML 문서의 정의된 레이아웃 및 차일드 뷰를 읽어 들여 뷰 객체를 생성해 내는 동작이다. &lt;br /&gt;
&lt;br /&gt;&lt;SPAN style=&quot;FONT-SIZE: 14pt&quot;&gt;&lt;STRONG&gt;LayoutInflater 객체의 사용&lt;br /&gt;
&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;br /&gt;
LayoutInflater의 객체는 new 연산자를 이용하여 직접적으로 생성할 수는 없다.&amp;nbsp;&lt;br /&gt;
&lt;FONT color=#000000&gt;&lt;FONT style=&quot;BACKGROUND-COLOR: #b1dab7&quot;&gt;&lt;FONT size=+0&gt;&lt;FONT size=+0&gt;&lt;SPAN style=&quot;FONT-SIZE: 8pt&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 9pt&quot;&gt;Activity 객체의 getLayoutInflater() 함수를 사용하거나 Context객체의 getSystemService()함수에 LAYOUT_INFLATER_SERVIE 상수를 넘겨주어 LayoutInflater 객체를 얻는다.&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;SPAN style=&quot;FONT-SIZE: 8pt&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 9pt&quot;&gt; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;br /&gt;
&lt;/FONT&gt;&lt;/FONT&gt;&lt;br /&gt;
그후 LayoutInflater&amp;nbsp;객체의 inflate() 함수를 이용해서 XML정의 된 레이아웃을 메모리에 올려 뷰객체로 생성을 하는데 &lt;br /&gt;
&lt;br /&gt;inflate()의 함수중 가장 많이 사용하는 형태는 아래와 같다. &lt;br /&gt;
&lt;br /&gt;&lt;STRONG&gt;&lt;SPAN style=&quot;FONT-SIZE: 11pt&quot;&gt;public &lt;/SPAN&gt;&lt;/STRONG&gt;&lt;A href=&quot;http://developer.android.com/reference/android/view/View.html&quot;&gt;&lt;STRONG&gt;&lt;SPAN style=&quot;FONT-SIZE: 11pt&quot;&gt;View&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/A&gt;&amp;nbsp;&lt;SPAN class=sympad&gt;&lt;STRONG&gt;&lt;SPAN style=&quot;FONT-SIZE: 11pt&quot;&gt;inflate&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN class=normal&gt;&lt;STRONG&gt;&lt;SPAN style=&quot;FONT-SIZE: 11pt&quot;&gt;(int resource, &lt;/SPAN&gt;&lt;/STRONG&gt;&lt;A href=&quot;http://developer.android.com/reference/android/view/ViewGroup.html&quot;&gt;&lt;STRONG&gt;&lt;SPAN style=&quot;FONT-SIZE: 11pt&quot;&gt;ViewGroup&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/A&gt;&lt;STRONG&gt;&lt;SPAN style=&quot;FONT-SIZE: 11pt&quot;&gt; root)&lt;/SPAN&gt;&lt;br /&gt;
&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;STRONG&gt;&lt;SPAN style=&quot;FONT-SIZE: 11pt&quot;&gt;public &lt;/SPAN&gt;&lt;/STRONG&gt;&lt;A href=&quot;http://developer.android.com/reference/android/view/View.html&quot;&gt;&lt;STRONG&gt;&lt;SPAN style=&quot;FONT-SIZE: 11pt&quot;&gt;View&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/A&gt;&amp;nbsp;&lt;SPAN class=sympad&gt;&lt;STRONG&gt;&lt;SPAN style=&quot;FONT-SIZE: 11pt&quot;&gt;inflate&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN class=normal&gt;&lt;STRONG&gt;&lt;SPAN style=&quot;FONT-SIZE: 11pt&quot;&gt;(int resource, &lt;/SPAN&gt;&lt;/STRONG&gt;&lt;A href=&quot;http://developer.android.com/reference/android/view/ViewGroup.html&quot;&gt;&lt;STRONG&gt;&lt;SPAN style=&quot;FONT-SIZE: 11pt&quot;&gt;ViewGroup&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/A&gt;&lt;STRONG&gt;&lt;SPAN style=&quot;FONT-SIZE: 11pt&quot;&gt; root, boolean attachToRoot)&lt;/SPAN&gt;&lt;br /&gt;
&lt;/STRONG&gt;I&lt;br /&gt;
inflate a new view hierarchy from the specified xml resource. Throws &lt;CODE&gt;&lt;A href=&quot;http://developer.android.com/reference/android/view/InflateException.html&quot;&gt;InflateException&lt;/A&gt;&lt;/CODE&gt; if there is an error.&lt;br /&gt;
&lt;br /&gt;
&lt;H5 class=jd-tagtitle&gt;Parameters&lt;/H5&gt;
&lt;TABLE class=jd-tagtable&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TH&gt;resource 
&lt;TD&gt;ID for an XML layout resource to load (e.g., &lt;CODE&gt;R.layout.main_page&lt;/CODE&gt;)&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TH&gt;root 
&lt;TD&gt;&lt;br /&gt;
Optional view to be the parent of the generated hierarchy (if &lt;EM&gt;attachToRoot&lt;/EM&gt; is true), or else simply an object that provides a set of LayoutParams values for root of the returned hierarchy (if &lt;EM&gt;attachToRoot&lt;/EM&gt; is false.)&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TH&gt;attachToRoot 
&lt;TD&gt;&lt;br /&gt;
Whether the inflated hierarchy should be attached to the root parameter? If false, root is only used to create the correct subclass of LayoutParams for the root view in the XML.&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;br /&gt;
(다른 형태들에 대해서는 아래의 사이트를 참조 한다. &lt;A href=&quot;http://developer.android.com/reference/android/view/LayoutInflater.html#inflate(int&quot;&gt;http://developer.android.com/reference/android/view/LayoutInflater.htm&lt;/A&gt;&amp;nbsp;)&lt;br /&gt;
&lt;br /&gt;위의 함수에 대한 설명을 풀어&amp;nbsp;보면 XML 리소스로 부터 뷰 객체를 생성한다고 나와 있으며 에러가 발생하는 경우 InflateException 을&amp;nbsp; 던진다 &lt;br /&gt;
&lt;br /&gt;&lt;STRONG&gt;&lt;FONT style=&quot;BACKGROUND-COLOR: #d42a1b&quot; color=#ffffff&gt;resource &lt;/FONT&gt;&lt;/STRONG&gt;는 레이아웃의 ID 값을 넣어주며 &lt;br /&gt;
&lt;br /&gt;&lt;FONT size=+0&gt;&lt;FONT style=&quot;BACKGROUND-COLOR: #d42a1b&quot;&gt;&lt;FONT color=#ffffff&gt;&lt;STRONG&gt;&lt;FONT size=+0&gt;&lt;SPAN style=&quot;FONT-SIZE: 9pt&quot;&gt;root &lt;/SPAN&gt;&lt;/FONT&gt;&lt;/STRONG&gt;&lt;br /&gt;
&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;값은 그 뒤의 파라미터 값인 attachToRoot 값이 true인 경우 부모가 되는 뷰를 지정하고, false인 경우&amp;nbsp;root파라미터에 대해서 단지 LayoutParam값을 제공할수 있는 객체로만 사용하게 된다. 사용하지 않는 경우는 null을 입력한다.&lt;br /&gt;
&lt;br /&gt;&lt;FONT style=&quot;BACKGROUND-COLOR: #d42a1b&quot; color=#ffffff&gt;&lt;STRONG&gt;attachToRoot&lt;/STRONG&gt;&lt;/FONT&gt; 는 true로 지정하는 경우 root파라미터에 대해 반드시 attached 되야 하는 대상임을 지정하고 &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 값이 false일 경우 LayoutParamas 값만 참조 하는 대상으로 지정하게 된다. &lt;br /&gt;
&lt;br /&gt;&lt;br /&gt;
이 함수를 호출하는 경우 View 객체를 반환하게 되며, 이렇게 반환된 View 객체는 XML상에 정의된 리소스들이다. &lt;br /&gt;
이는 XML 레이아웃을 나누어 정의 한후 하나의 레이아웃에 동적으로 붙이고자 할때 유용하게 쓸수 있다. &lt;br /&gt;
&lt;br /&gt;&lt;br /&gt;
&lt;/SPAN&gt;&lt;div class=&quot;blogger-news-widget&quot; style=&quot;width: 100%; text-align: center&quot;&gt;
		  					&lt;embed src=&quot;http://api.v.daum.net/static/recombox1.swf&quot; quality=&quot;high&quot; flashvars=&quot;nid=26807146&quot; allowscriptaccess=&quot;always&quot; allowfullscreen=&quot;false&quot; bgcolor=&quot;#ffffff&quot; width=&quot;400&quot; height=&quot;80&quot; type=&quot;application/x-shockwave-flash&quot; wmode=&quot;transparent&quot;&gt;&lt;/embed&gt;
						&lt;/div&gt;&lt;div style='text-align: center; margin: 10px auto; height: 91px; overflow: hidden; clear: both;'&gt;&lt;iframe title='mixUP 위젯' src='http://mixsh.com/widget/new_mixup/loader_plugin.html?domain=sanaigon.tistory.com&amp;media_type=10&amp;guid=sanaigon.tistory.com%2F152&amp;regts=1331622828&amp;showhitcnt=1&amp;platform=10' frameBorder='0' scrolling='no' allowTransparency='true' width='402' height='130'&gt;&lt;/iframe&gt;&lt;/div&gt;</description>
			<category>Android</category>
			<author>J.K 스나이퍼</author>
			<guid>http://sanaigon.tistory.com/152</guid>
			<comments>http://sanaigon.tistory.com/152#entry152comment</comments>
			<pubDate>Tue, 13 Mar 2012 16:08:09 +0900</pubDate>
		</item>
		<item>
			<title>내 나이 서른... 결혼이 망설여 지는 이유...</title>
			<link>http://sanaigon.tistory.com/151</link>
			<description>&lt;SPAN style=&quot;FONT-SIZE: 18pt&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 14pt&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 24pt&quot;&gt;&lt;STRONG&gt;&lt;SPAN style=&quot;FONT-SIZE: 18pt&quot;&gt;요&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;즘 즐겨 보는 프로그램 중에 SBS의 '짝' 이란 프로그램이 있다. &lt;br /&gt;
뭐 프로그램의 내용은&amp;nbsp;간단하게 보면 이렇다.&amp;nbsp;결혼 적령기에 있는 20대 후반에서 30대 후반까지의 남녀가 서로의 배우자를 만나기 위해 짝을 찾는 과정을 보여주고 있는 컨셉의 프로그램이다. &lt;br /&gt;
&lt;br /&gt;
&lt;P style=&quot;MARGIN: 0px&quot;&gt;&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;a href=&quot;http://cfile23.uf.tistory.com/original/156F364E4F5E0EF432EC56&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile23.uf.tistory.com/image/156F364E4F5E0EF432EC56&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;39768438_2.jpg&quot; height=&quot;271&quot; width=&quot;417&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;/P&gt;&lt;br /&gt;
&lt;br /&gt;나 또한 결혼 적령기의 이제 막 접어든 남성으로서 나름 흥미진지하게 보고 있으나, 그 프로그램에 나오는 출연자들을 보면 보통의 사람들이라기 보다는 상위 10%안에 드는 어느정도 성공을 이뤘거나 집안 배경이 좋은 사람들이 많이들 나온다는 느낌이 든다.&lt;br /&gt;
'짝'에 출연하는 출연진들은 결혼에 대한 준비가 대부분은 끝난 사람들로서 오로지 짝을 찾는 일에만 몰두 하는 모습을 보여준다.&amp;nbsp;&lt;br /&gt;
&lt;br /&gt;하지만&amp;nbsp;그게 이 세상을 살아가는 30대 초반의 대부분의 모습일까??&lt;br /&gt;
결혼이라는 인생의 큰 과제를 해결하기 위해서는 좋은 배우자를 만나는 일 뿐만 아니라 현실적으로 해결해야 할 어려운 과제들이 너무나도 많다. &lt;br /&gt;
&lt;br /&gt;예전에 어느 한 기사에서 우리나라&amp;nbsp;남성의 평균 결혼 비용이 1억원 정도를 한다는 기사를 본 적이 있다. 말이 쉬워 1억이지 1억원이 어떻게 생겼는지도 모르고 이제 취업한지 3년 남짓 되는 나로서는 통장에 찍혀본적도 없는 그런 돈이다. &lt;br /&gt;
&lt;br /&gt;엘리트 코스를&amp;nbsp;밟아 명문대 졸업후 고액 연봉을 받는 취업자리를 운 좋게 차지한 사람이라면&amp;nbsp;모르겠으나, 흔히 말하는 서민에 속하는 나로서는 다음과 같은&amp;nbsp;이유로 인해&amp;nbsp;결혼에 대한&amp;nbsp;큰 고민을 갖고 있다. &lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
&lt;STRONG&gt;&lt;SPAN style=&quot;FONT-SIZE: 14pt&quot;&gt;1. 학자금 대출의 노예&lt;br /&gt;
&lt;br /&gt;&lt;/SPAN&gt;&lt;/STRONG&gt;
&lt;P style=&quot;MARGIN: 0px&quot;&gt;&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;a href=&quot;http://cfile23.uf.tistory.com/original/134EC64D4F5E0F36075C6C&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile23.uf.tistory.com/image/134EC64D4F5E0F36075C6C&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;imagesCALCY7AN.jpg&quot; height=&quot;192&quot; width=&quot;262&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;/P&gt;&lt;br /&gt;
내 주변 친구들을 보면&amp;nbsp;어느 정도 사는&amp;nbsp;몇몇 친구들을 제외 하고는 학자금을 일부라도 지원받아서 졸업을 한 친구들이 많다. 그 친구들은 운 좋게 취업이 되었다 한들 한달에 몇십만원에 해당하는 이자 및 원금 갚기도 바빠서 적금 부을 여력도 녹록치 않다. &lt;br /&gt;
정부는 오르는 대학교 등록금 잡을 생각도 하지도 않고 그저 학자금 대출을 더 권장하는 쪽으로 정책을 정하는 것 같다. 그나마 취업을 한 사람이면 다행이지만 취업난이 심각한 요즘 취업마저 못한 20대들은 빚더미의 굴레에서 벗어나려고 발버둥 치기도 바쁘다.&lt;br /&gt;
그런 그들에게 결혼비용 1억원이란 정말 사치에 불과 하다. &lt;br /&gt;
&lt;br /&gt;&lt;STRONG&gt;&lt;SPAN style=&quot;FONT-SIZE: 14pt&quot;&gt;2. 전세 대란 &lt;br /&gt;
&lt;br /&gt;&lt;/SPAN&gt;&lt;/STRONG&gt;
&lt;P style=&quot;MARGIN: 0px&quot;&gt;&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;a href=&quot;http://cfile4.uf.tistory.com/original/185ED5474F5E0FBB163A10&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile4.uf.tistory.com/image/185ED5474F5E0FBB163A10&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;1393069197.jpg&quot; height=&quot;268&quot; width=&quot;302&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;/P&gt;&lt;br /&gt;
일단 서울에서 아파트 전세는 언급하지 않겠다. 부동산좀 아는 사람이 아니라도&amp;nbsp;서울에서의 전세는 1억원대의 전세를 찾아보기도 힘들 뿐더러 정말 좁거나 오래된 아파트일 가능성이 농후하다.&lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
결혼이라는 새출발을 위한 보금자리가 되는 집문제는 가장중요한 문제지만 결혼비용을 부축이는 젤 큰 요인이기도 하다. 경기도 권에서 24평 정도의 아파트를 구하려면 적어도 8천에서 9천 정도의 전세 보증금이 필요로 하다. (거의 젤 저렴한 가격을 예로 든것이다.) 그렇다고 평수를 줄일 수도 없다. 왜냐? 매물이 거의 없기 때문이다.&amp;nbsp;매매가의 70%~80%대를 넘나드는 전세 보증금을 구하려면 부모님에게 도움을 요청하거나 역시 또&amp;nbsp;나라에서 친절하게 마련해주신&amp;nbsp;'신혼부부 전세자금 대출' 같은 또 빚을 내야 한다. 봉급쟁이로 3~4년동안 일만 해서 9천만원 모으기란 숨만쉬고 살아도 정말 모으기 힘든 돈이기 때문에 우리 들은 집을 구하기 위해 다른 누군가에게 도움을 요청해야 한다. &lt;br /&gt;
&lt;br /&gt;그나마 도움을 요청할수 있다면 다행이지만 요청할수 있는 여력도 안되는(학자금 대출조차 다 못갚은) 상황이 될 수 밖에 없는 이들은 이쯤 되면 결혼을 꼭 해야 하나 라는 생각이 들 것이다. &lt;br /&gt;
&lt;br /&gt;&lt;SPAN style=&quot;FONT-SIZE: 14pt&quot;&gt;&lt;STRONG&gt;3. 식장 및 혼수 비용&lt;br /&gt;
&lt;br /&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;br /&gt;

&lt;P style=&quot;MARGIN: 0px&quot;&gt;&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;a href=&quot;http://cfile23.uf.tistory.com/original/147A31484F5E0FE4158C7F&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile23.uf.tistory.com/image/147A31484F5E0FE4158C7F&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;DSC_6417.jpg&quot; height=&quot;235&quot; width=&quot;418&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;/P&gt;&lt;br /&gt;
결혼 비용의 대부분이 전세보증금 마련이겠지만 그 외에 많이 드는 비용이 식장 및 혼수 비용이다. 일반적으로 3~4만원대 하는 뷔페식당을 끼고 기본 400인분을 계산하면 식장 비용만 천만원대는 그냥 넘어가는 현실이다. 결혼식 뷔페 하면 3~4만원 정도의 일반 씨푸드 뷔페만도 못 할때가 많은데... 어쩔수 없이 선택해야 하는 경우가 많다.&lt;br /&gt;
&lt;br /&gt;정부가 규제를 하지 않는 건지 어떤건지는 잘 모르겠으나 우리나라의 식장 비용 및 여러 관혼상제 관련 비용은 정말 바가지가 심한 편이다. 대부분의 사람들이 기쁜일에는 돈을 아끼는 것이 아니라고 생각을 하기 때문에 그냥 비싼거 알지만 울며 겨자먹기 식으로 돈을 지불 하는 경우가 많기는 하지만 &lt;STRONG&gt;식장 및 혼수까지 하여 4천~5천만원을 넘는 비용을 감당하기에는 우리들의 연봉은 너무 적고 취업 한지는 얼마 되지 않은 경우가 많다. &lt;/STRONG&gt;&lt;br /&gt;
&lt;br /&gt;그나마 혼수는 개념있는 부부라면 알뜰살뜰 하게 비용을 절감해 나갈 수 있는 방법이 있으나, 아직 우리나라의 결혼 문화 상으로 결혼에 대한 비용을 아끼는 것을 부모님들이 꺼려하시는 경우가 많기 때문에 부족한 집안에서 많이 부담이 가는 편이라고 할 수 있다. &lt;br /&gt;
&lt;br /&gt;&lt;SPAN style=&quot;FONT-SIZE: 14pt&quot;&gt;&lt;STRONG&gt;4. 우린 평생 대출의 노예??&lt;br /&gt;
&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;br /&gt;
내가 요약한 몇 가지만 보더라고 평범한 가정에서 태어나 부모님의 도움 없이 결혼을 한다고 치면 은행의 대출을 끼지 않고서는 현실적으로 힘든 문제라고 볼수 있다.&amp;nbsp;&lt;br /&gt;
&lt;br /&gt;&lt;STRONG&gt;우리는 현실적으로 새로운&amp;nbsp;가정을 꾸리는 순간부터 관속에 몸을 담는 그날까지 빚만&amp;nbsp;갚아야 할지도 모른다....&lt;br /&gt;
&lt;/STRONG&gt;&lt;br /&gt;
결혼 비용만 생각해도 이렇게 걱정인데..&amp;nbsp; 결혼 후 육아 문제 노후준비 등은 다&amp;nbsp;언제 어떻게 해야 한단 말인가..&amp;nbsp;&lt;br /&gt;
정말 걱정만 쌓여가는 현실이다.&amp;nbsp;&lt;br /&gt;
&lt;br /&gt;정부는 가계대출 증가때문에&amp;nbsp;걱정을 하고 그에 대한 궁여지책으로 가계대출을 억제 정책을&amp;nbsp;피려고 하고 있으나, 이는 이러한 문제에 대한 근본적인 해결책이 아닌걸 잘 알고 있을 것이다.&amp;nbsp;이러한 '언 발의 오줌누는' 형식의&amp;nbsp;정책이 아닌 현실적인 정책을 펼쳐서&amp;nbsp;&lt;br /&gt;
&lt;br /&gt;&lt;STRONG&gt;지금 이 시기를 살아가는 결혼 적령기의 남녀의 결혼이 망설여 지는 이유를 그나마 해결 해 주었으면 한다. &lt;br /&gt;
제발...... Plz......&lt;br /&gt;
&lt;br /&gt;&lt;/STRONG&gt;&lt;STRONG style=&quot;TEXT-ALIGN: center&quot;&gt;&lt;/STRONG&gt;&lt;STRONG style=&quot;TEXT-ALIGN: center&quot;&gt;
&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;/STRONG&gt;&lt;STRONG&gt;&lt;br /&gt;
&lt;br /&gt;&lt;/STRONG&gt;&lt;STRONG style=&quot;TEXT-ALIGN: center&quot;&gt;&lt;/STRONG&gt;&lt;STRONG style=&quot;TEXT-ALIGN: center&quot;&gt;&lt;/STRONG&gt;&lt;STRONG style=&quot;TEXT-ALIGN: center&quot;&gt;&lt;/STRONG&gt;&lt;STRONG style=&quot;TEXT-ALIGN: center&quot;&gt;&lt;FONT color=#193da9&gt;&lt;SPAN style=&quot;FONT-SIZE: 12pt&quot;&gt;내용이 유익했다면 손가락 꾸욱!!&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/STRONG&gt;&lt;div class=&quot;blogger-news-widget&quot; style=&quot;width: 100%; text-align: center&quot;&gt;
		  					&lt;embed src=&quot;http://api.v.daum.net/static/recombox1.swf&quot; quality=&quot;high&quot; flashvars=&quot;nid=26779778&quot; allowscriptaccess=&quot;always&quot; allowfullscreen=&quot;false&quot; bgcolor=&quot;#ffffff&quot; width=&quot;400&quot; height=&quot;80&quot; type=&quot;application/x-shockwave-flash&quot; wmode=&quot;transparent&quot;&gt;&lt;/embed&gt;
						&lt;/div&gt;&lt;div style='text-align: center; margin: 10px auto; height: 91px; overflow: hidden; clear: both;'&gt;&lt;iframe title='mixUP 위젯' src='http://mixsh.com/widget/new_mixup/loader_plugin.html?domain=sanaigon.tistory.com&amp;media_type=10&amp;guid=sanaigon.tistory.com%2F151&amp;regts=1331566710&amp;showhitcnt=1&amp;platform=10' frameBorder='0' scrolling='no' allowTransparency='true' width='402' height='130'&gt;&lt;/iframe&gt;&lt;/div&gt;</description>
			<category>생활/경제</category>
			<author>J.K 스나이퍼</author>
			<guid>http://sanaigon.tistory.com/151</guid>
			<comments>http://sanaigon.tistory.com/151#entry151comment</comments>
			<pubDate>Mon, 12 Mar 2012 18:22:38 +0900</pubDate>
		</item>
		<item>
			<title>Sleep(0)과 Sleep(1)의 차이</title>
			<link>http://sanaigon.tistory.com/150</link>
			<description>&lt;br /&gt;
&amp;nbsp;Thread 간 우선순위(Priority) 가 다른 경우에 사용법이 틀려 진다.&lt;br /&gt;
&lt;br /&gt;&lt;STRONG&gt;1. Sleep(0)&lt;/STRONG&gt;&lt;br /&gt;
다른 Thread 가 Ready to run 되었다고 해서 자신이 쥐고 있는 CPU의 선점을 풀지 않는다.&lt;br /&gt;
&amp;nbsp;Ready to run 되어 있는 Thread 가 지금 선점한 Thread 와 우선순위가 같아야 선점을 푼다. &lt;br /&gt;
&lt;br /&gt;이 함수를 호출한 스레드가 남은 타임 슬리아스(Time Slace) 를 자동적으로 포기하여 시스템이&lt;br /&gt;
다른 스레드를 스케줄 하게 한다. 그런데 시스템에 이 함수를 호출한 스레드와 우선순위가 같거나&lt;br /&gt;
그보다 높은 스레드 중에 스케줄 가능 스레드가 없는 경우 Sleep 함수를 호출한 스레드가 다시 &lt;br /&gt;
스케줄 될 수도 있다.&lt;br /&gt;
&lt;br /&gt;&lt;br /&gt;
&lt;STRONG&gt;2. Sleep(1)&lt;/STRONG&gt;&lt;br /&gt;
Thread 간의 우선순위에 관계없이 다른 Thread 가 Ready to run 상태에 있다면 자신이 쥐고 있던 Thread 선점을 풀고&lt;br /&gt;
Ready to run 상태인 Thread 에 CPU 를 넘겨준다.&lt;br /&gt;
즉, Context switching 이 이루어 진다.
&lt;SCRIPT src=&quot;http://six605.tistory.com/plugin/CallBack_bootstrapper?&amp;amp;src=http://s1.daumcdn.net/cfs.tistory/v/0/blog/plugins/CallBack/callback&amp;amp;id=258&amp;amp;callbackId=six605tistorycom2587176&amp;amp;destDocId=callbacknestsix605tistorycom2587176&amp;amp;host=http://six605.tistory.com&amp;amp;float=left&amp;amp;random=14&quot;&gt;&lt;/SCRIPT&gt;&lt;div style='text-align: center; margin: 10px auto; height: 91px; overflow: hidden; clear: both;'&gt;&lt;iframe title='mixUP 위젯' src='http://mixsh.com/widget/new_mixup/loader_plugin.html?domain=sanaigon.tistory.com&amp;media_type=10&amp;guid=sanaigon.tistory.com%2F150&amp;regts=1323828421&amp;showhitcnt=1&amp;platform=10' frameBorder='0' scrolling='no' allowTransparency='true' width='402' height='130'&gt;&lt;/iframe&gt;&lt;/div&gt;</description>
			<category>Windows Programming (MFC)</category>
			<author>J.K 스나이퍼</author>
			<guid>http://sanaigon.tistory.com/150</guid>
			<comments>http://sanaigon.tistory.com/150#entry150comment</comments>
			<pubDate>Wed, 14 Dec 2011 11:07:01 +0900</pubDate>
		</item>
		<item>
			<title>[펌] CListCtrl 작업시 유용한 것들</title>
			<link>http://sanaigon.tistory.com/149</link>
			<description>&lt;br /&gt;

&lt;TABLE border=0 cellSpacing=0 cellPadding=0 width=&quot;100%&quot; align=center&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD width=&quot;5%&quot;&gt;&lt;/TD&gt;
&lt;TD vAlign=top width=&quot;74%&quot;&gt;
&lt;DIV id=LEFT&gt;&lt;!-- egloos content start --&gt;
&lt;DIV class=hentry&gt;&lt;SPAN style=&quot;DISPLAY: none&quot; class=copyright_entry title=&quot;리스트컨트롤 작업시 유용한것들.@@**@@http://minujang.egloos.com/2254211&quot;&gt;&lt;/SPAN&gt;
&lt;DIV class=POST&gt;
&lt;DIV class=POST_HEAD&gt;
&lt;TABLE border=0 cellSpacing=0 cellPadding=0 width=&quot;100%&quot;&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD width=&quot;80%&quot;&gt;
&lt;DIV class=POST_TTL&gt;&lt;A title=&quot;리스트컨트롤 작업시 유용한것들.&quot; name=2254211&gt;리스트컨트롤 작업시 유용한것들.&lt;/A&gt;&lt;/DIV&gt;&lt;/TD&gt;
&lt;TD width=&quot;20%&quot; align=right&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/DIV&gt;
&lt;DIV class=POST_BODY&gt;&lt;SPAN style=&quot;LINE-HEIGHT: 22px; FONT-FAMILY: 돋움; COLOR: rgb(218,218,218)&quot; class=Apple-style-span&gt;
&lt;DIV&gt;&lt;FONT style=&quot;LINE-HEIGHT: 150%&quot;&gt;&lt;FONT style=&quot;LINE-HEIGHT: 150%&quot; size=2&gt;&lt;FONT class=Apple-style-span face=Verdana&gt;&lt;FONT class=Apple-style-span color=#000000&gt;1. 특정 ROW 포커스 주기&lt;br /&gt;
2. 특정 ROW로 가기&lt;br /&gt;
3. 헤더 컬럼수 얻어오기&lt;br /&gt;
4. 컬럼의 너비를 이쁘게 주기&lt;br /&gt;
5. 한줄 쭉 선택되게 하기, 그리드 라인 주기&lt;br /&gt;
6. 선택한 아이템(ROW)를 지우기&lt;br /&gt;
7. 두 아이템을 스왑 하기&lt;br /&gt;
8.기존에 선택되어있는 것을 해체하기&lt;br /&gt;
9. 리스트컨트롤내 모든 항목을 선택하기&lt;br /&gt;
10. 리스트컨트롤내 모든 항목을 선택해제 하기&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;FONT style=&quot;LINE-HEIGHT: 150%&quot;&gt;&lt;FONT style=&quot;LINE-HEIGHT: 150%&quot; size=2&gt;&lt;FONT class=Apple-style-span face=Verdana&gt;&lt;FONT class=Apple-style-span color=#000000&gt;11. 리스트컨트롤에 선택된 항목을 클립보드에 저장하기.&lt;br /&gt;
&lt;br /&gt;1. 특정 ROW 포커스 주기&lt;br /&gt;
---------------------------------------------------&lt;br /&gt;
리스트 컨트롤에서 어떤 특정 Row를 선택하게 하고 싶을때&lt;br /&gt;
( 이때 선택뿐아니라 포커스도 가야 한다.&lt;br /&gt;
포커스가 간다는 의미는 다음에 키다운을 하면 바로 부드럽게&lt;br /&gt;
다음 아이템을 가리키도록 하는 것이다 )&lt;br /&gt;
&lt;br /&gt;ListView_SetItemState (pListCtrl-&amp;gt;GetSafeHwnd(), // handle to listview&lt;br /&gt;
10, // index to listview item&lt;br /&gt;
LVIS_FOCUSED | LVIS_SELECTED, // item state&lt;br /&gt;
0x000F); //mask&lt;br /&gt;
&lt;br /&gt;위와 같이 코딩하면 된다.&lt;br /&gt;
&lt;br /&gt;&lt;br /&gt;
2. 특정 ROW로 가기&lt;br /&gt;
---------------------------------------------------&lt;br /&gt;
만일 원하는 Row를 스크롤을 하던 어떻게 하든 화면에 보이게&lt;br /&gt;
하고 싶을때&lt;br /&gt;
&lt;br /&gt;pListCtrl-&amp;gt;EnsureVisible(15, TRUE);&lt;br /&gt;
&lt;br /&gt;이렇게 하면 된다.&lt;br /&gt;
&lt;br /&gt;&lt;br /&gt;
3. 헤더 컬럼수 얻어오기&lt;br /&gt;
---------------------------------------------------&lt;br /&gt;
헤더 컬럼의 갯수를 알고 싶을때&lt;br /&gt;
CHeaderCtrl* pHeader = (CHeaderCtrl*)GetDlgItem(0);&lt;br /&gt;
int nColumnCount = pHeader-&amp;gt;GetItemCount();&lt;br /&gt;
&lt;br /&gt;또는 pList-&amp;gt;GetHeaderCtrl()을 통해서 얻어올수 도 있다.&lt;br /&gt;
&lt;br /&gt;&lt;br /&gt;
4. 컬럼의 너비를 이쁘게 주기&lt;br /&gt;
---------------------------------------------------&lt;br /&gt;
공백없이 잘 채워 준다.&lt;br /&gt;
&lt;br /&gt;부모 다이얼로그의 OnSize에서&lt;br /&gt;
void CAttrListDlg::OnSize(UINT nType, int cx, int cy) &lt;br /&gt;
{&lt;br /&gt;
CDialog::OnSize(nType, cx, cy);&lt;br /&gt;
&lt;br /&gt;// TODO: Add your message handler code here&lt;br /&gt;
if( IsWindow( z_AttrList.m_hWnd ))&lt;br /&gt;
{&lt;br /&gt;
z_AttrList.MoveWindow( 0, 0, cx, cy );&lt;br /&gt;
z_AttrList.SetColumnWidth(1 , LVSCW_AUTOSIZE_USEHEADER);&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;&lt;br /&gt;
5. 한줄 쭉 선택되게 하기, 그리드 라인 주기&lt;br /&gt;
---------------------------------------------------&lt;br /&gt;
z_AttrList.SetExtendedStyle(LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT); &lt;br /&gt;
&lt;br /&gt;&lt;br /&gt;
6. 선택한 아이템(ROW)를 지우기&lt;br /&gt;
---------------------------------------------------&lt;br /&gt;
&lt;br /&gt;CDWordArray m_anDragIndexes; // 선택한 아이템을 기억하는&lt;br /&gt;
배열&lt;br /&gt;
&lt;br /&gt;int CAttrList::fnRemoveItem()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;m_anDragIndexes.RemoveAll();&lt;br /&gt;
POSITION pos = GetFirstSelectedItemPosition();&lt;br /&gt;
while (pos)&lt;br /&gt;
{&lt;br /&gt;
m_anDragIndexes.Add(GetNextSelectedItem(pos));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;int nSize = m_anDragIndexes.GetSize(); &lt;br /&gt;
int nRet = -1;&lt;br /&gt;
if( nSize )&lt;br /&gt;
nRet = m_anDragIndexes[0]; &lt;br /&gt;
&lt;br /&gt;while( nSize-- )&lt;br /&gt;
DeleteItem( m_anDragIndexes[nSize] );&lt;br /&gt;
&lt;br /&gt;m_anDragIndexes.RemoveAll();&lt;br /&gt;
return nRet;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;&lt;br /&gt;
7. 두 아이템을 스왑 하기&lt;br /&gt;
---------------------------------------------------&lt;br /&gt;
void CAttrList::fnSwapItem( int nItem1, int nItem2 )&lt;br /&gt;
{&lt;br /&gt;
int hi = nItem2;&lt;br /&gt;
int lo = nItem1;&lt;br /&gt;
CStringArray rowText;&lt;br /&gt;
&lt;br /&gt;LV_ITEM lvitemlo, lvitemhi;&lt;br /&gt;
CHeaderCtrl* pHeaderCtrl = GetHeaderCtrl();&lt;br /&gt;
int nColCount =pHeaderCtrl-&amp;gt;GetItemCount();&lt;br /&gt;
&lt;br /&gt;rowText.SetSize( nColCount );&lt;br /&gt;
int i;&lt;br /&gt;
for( i=0; i&amp;lt;nColCount; i++)&lt;br /&gt;
rowText[i] = GetItemText(lo, i);&lt;br /&gt;
lvitemlo.mask = LVIF_IMAGE | LVIF_PARAM | LVIF_STATE;&lt;br /&gt;
lvitemlo.iItem = lo;&lt;br /&gt;
lvitemlo.iSubItem = 0;&lt;br /&gt;
lvitemlo.stateMask = LVIS_CUT | LVIS_DROPHILITED |&lt;br /&gt;
LVIS_FOCUSED | LVIS_SELECTED |&lt;br /&gt;
LVIS_OVERLAYMASK | LVIS_STATEIMAGEMASK;&lt;br /&gt;
&lt;br /&gt;lvitemhi = lvitemlo;&lt;br /&gt;
lvitemhi.iItem = hi;&lt;br /&gt;
&lt;br /&gt;GetItem( &amp;amp;lvitemlo );&lt;br /&gt;
GetItem( &amp;amp;lvitemhi );&lt;br /&gt;
&lt;br /&gt;for( i=0; i&amp;lt;nColCount; i++)&lt;br /&gt;
SetItemText(lo, i, GetItemText(hi, i));&lt;br /&gt;
&lt;br /&gt;lvitemhi.iItem = lo;&lt;br /&gt;
SetItem( &amp;amp;lvitemhi );&lt;br /&gt;
&lt;br /&gt;for( i=0; i&amp;lt;nColCount; i++)&lt;br /&gt;
SetItemText(hi, i, rowText[i]);&lt;br /&gt;
&lt;br /&gt;lvitemlo.iItem = hi;&lt;br /&gt;
SetItem( &amp;amp;lvitemlo );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;8.기존에 선택되어있는 것을 해체하기&lt;br /&gt;
-----------------------------------&lt;br /&gt;
int nOldItem = GetSelectionMark();&lt;br /&gt;
if( nOldItem &amp;gt; 0 )&lt;br /&gt;
SetItemState( nOldItem , 0, LVIS_SELECTED);&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;FONT class=Apple-style-span face=Verdana&gt;&lt;FONT class=Apple-style-span color=#000000&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;FONT style=&quot;LINE-HEIGHT: 150%&quot;&gt;&lt;FONT style=&quot;LINE-HEIGHT: 150%&quot; size=2&gt;&lt;FONT class=Apple-style-span face=Verdana&gt;&lt;FONT class=Apple-style-span color=#000000&gt;9. 리스트컨트롤내 모든 항목을 선택하기&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;FONT style=&quot;LINE-HEIGHT: 150%&quot; size=2&gt;&lt;FONT class=Apple-style-span face=Verdana&gt;&lt;FONT class=Apple-style-span color=#000000&gt;-----------------------------------&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;FONT style=&quot;LINE-HEIGHT: 150%&quot;&gt;&lt;FONT class=Apple-style-span face=Verdana&gt;&lt;FONT class=Apple-style-span color=#000000&gt;void OnSelectAll()&lt;br /&gt;
{&lt;br /&gt;
// Make sure the focus is set to the list view control.&lt;br /&gt;
m_list.SetFocus();&lt;br /&gt;
&lt;br /&gt;int n = 0;&lt;br /&gt;
int nLast = m_list.GetItemCount();&lt;br /&gt;
&lt;br /&gt;for (;n &amp;lt; nLast;n++)&lt;br /&gt;
{&lt;br /&gt;
m_list.SetItemState(n, LVIS_SELECTED, LVIS_SELECTED);&lt;br /&gt;
//ASSERT(m_list.GetItemState(n, LVIS_SELECTED) == LVIS_SELECTED);&lt;br /&gt;
} &lt;br /&gt;
}&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;FONT class=Apple-style-span face=Verdana&gt;&lt;FONT class=Apple-style-span color=#000000&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/DIV&gt;&lt;FONT style=&quot;LINE-HEIGHT: 150%&quot;&gt;
&lt;DIV&gt;&lt;FONT style=&quot;LINE-HEIGHT: 150%&quot;&gt;&lt;FONT style=&quot;LINE-HEIGHT: 150%&quot; size=2&gt;&lt;FONT class=Apple-style-span face=Verdana&gt;&lt;FONT class=Apple-style-span color=#000000&gt;10. 리스트컨트롤내 모든 항목을 선택해제 하기&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;FONT style=&quot;LINE-HEIGHT: 150%&quot; size=2&gt;&lt;FONT class=Apple-style-span face=Verdana&gt;&lt;FONT class=Apple-style-span color=#000000&gt;-----------------------------------&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/DIV&gt;&lt;/FONT&gt;
&lt;DIV&gt;&lt;FONT style=&quot;LINE-HEIGHT: 150%&quot;&gt;&lt;FONT class=Apple-style-span face=Verdana&gt;&lt;FONT class=Apple-style-span color=#000000&gt;void OnUnSelectAll()&lt;br /&gt;
{&lt;br /&gt;
m_list.SetFocus();&lt;br /&gt;
&lt;br /&gt;// Select all of the items that are completely visible.&lt;br /&gt;
int n = 0;&lt;br /&gt;
int nLast = m_list.GetItemCount();&lt;br /&gt;
&lt;br /&gt;for (;n &amp;lt; nLast;n++)&lt;br /&gt;
{&lt;br /&gt;
//현재 선택되어 있는 항목만, 선택해제&lt;br /&gt;
if(m_list.GetItemState(n, LVIS_SELECTED) == LVIS_SELECTED){&lt;br /&gt;
m_list.SetItemState(n, 0, LVIS_SELECTED);&lt;br /&gt;
m_list.SetItemState(n, 0, LVIS_FOCUSED); //포커스 해제&lt;br /&gt;
} &lt;br /&gt;
} &lt;br /&gt;
}&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;FONT class=Apple-style-span face=Verdana&gt;&lt;FONT class=Apple-style-span color=#000000&gt;&lt;FONT style=&quot;LINE-HEIGHT: 150%&quot;&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;FONT style=&quot;LINE-HEIGHT: 150%&quot;&gt;&lt;FONT class=Apple-style-span face=Verdana&gt;&lt;FONT class=Apple-style-span color=#000000&gt;11. 리스트컨트롤에 선택된 항목을 클립보드에 저장하기.&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;FONT style=&quot;LINE-HEIGHT: 150%&quot;&gt;&lt;FONT style=&quot;LINE-HEIGHT: 150%&quot; size=2&gt;&lt;FONT class=Apple-style-span face=Verdana&gt;&lt;FONT class=Apple-style-span color=#000000&gt;-----------------------------------&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT class=Apple-style-span face=Verdana&gt;&lt;FONT class=Apple-style-span color=#000000&gt;&lt;br /&gt;
CListCtrl m_list;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;FONT style=&quot;LINE-HEIGHT: 150%&quot;&gt;&lt;FONT class=Apple-style-span face=Verdana&gt;&lt;FONT class=Apple-style-span color=#000000&gt;void OnSelectCopy()&lt;br /&gt;
{&lt;br /&gt;
CString str;&lt;br /&gt;
__CopyTextFromGrid(str);&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;FONT style=&quot;LINE-HEIGHT: 150%&quot;&gt;&lt;FONT class=Apple-style-span face=Verdana&gt;&lt;FONT class=Apple-style-span color=#000000&gt;__ClipCopy((LPSTR)(LPCSTR)str);&lt;br /&gt;
}&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;FONT style=&quot;LINE-HEIGHT: 150%&quot;&gt;&lt;FONT class=Apple-style-span face=Verdana&gt;&lt;FONT class=Apple-style-span color=#000000&gt;void __CopyTextFromGrid(CString&amp;amp; totalTxt)&lt;br /&gt;
{&lt;br /&gt;
int m_Cols = 2;&lt;br /&gt;
totalTxt.Empty();&lt;br /&gt;
POSITION pos = m_list.GetFirstSelectedItemPosition();&lt;br /&gt;
if (pos == NULL)&lt;br /&gt;
TRACE0(&quot;No items were selected!\n&quot;);&lt;br /&gt;
else&lt;br /&gt;
{&lt;br /&gt;
while (pos)&lt;br /&gt;
{&lt;br /&gt;
int nItem = m_list.GetNextSelectedItem(pos);&lt;br /&gt;
&lt;br /&gt;CString str;&lt;br /&gt;
str.Empty();&lt;br /&gt;
&lt;br /&gt;int i =0;&lt;br /&gt;
for(i=0; i&amp;lt;m_Cols; i++)&lt;br /&gt;
{&lt;br /&gt;
if(i==0)&lt;br /&gt;
str=m_list.GetItemText((int)nItem, i);&lt;br /&gt;
else&lt;br /&gt;
str += m_list.GetItemText((int)nItem, i);&lt;br /&gt;
str += &quot; \t&quot;;&lt;br /&gt;
}&lt;br /&gt;
str += &quot;\r\n&quot;;&lt;br /&gt;
totalTxt += str;&lt;br /&gt;
TRACE1(&quot;Item %d was selected!\n&quot;, nItem); &lt;br /&gt;
}&lt;br /&gt;
} &lt;br /&gt;
}&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/DIV&gt;&lt;FONT style=&quot;LINE-HEIGHT: 150%&quot;&gt;&lt;FONT class=Apple-style-span face=Verdana&gt;&lt;FONT class=Apple-style-span color=#000000&gt;BOOL __ClipCopy(char *txt)&lt;br /&gt;
{&lt;br /&gt;
HGLOBAL hglbCopy;&lt;br /&gt;
char* lptstrCopy; &lt;br /&gt;
&lt;br /&gt;if (!::OpenClipboard(AfxGetMainWnd()-&amp;gt;GetSafeHwnd())) &lt;br /&gt;
return FALSE; &lt;br /&gt;
EmptyClipboard(); &lt;br /&gt;
&lt;br /&gt;hglbCopy = GlobalAlloc(GMEM_MOVEABLE, strlen(txt)+1);&lt;br /&gt;
if (hglbCopy == NULL) &lt;br /&gt;
{&lt;br /&gt;
CloseClipboard(); &lt;br /&gt;
return FALSE; &lt;br /&gt;
} &lt;br /&gt;
lptstrCopy =(char*)GlobalLock(hglbCopy); &lt;br /&gt;
memcpy(lptstrCopy, txt, strlen(txt)+1); &lt;br /&gt;
//lptstrCopy[strlen(txt)] = 0;&lt;br /&gt;
GlobalUnlock(hglbCopy); &lt;br /&gt;
&lt;br /&gt;&lt;br /&gt;
SetClipboardData(CF_TEXT, hglbCopy); &lt;br /&gt;
&lt;br /&gt;CloseClipboard(); &lt;br /&gt;
return TRUE;&lt;br /&gt;
&lt;br /&gt;} &lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;!--
       &lt;rdf:RDF xmlns:rdf=&quot;http://www.w3.org/1999/02/22-rdf-syntax-ns#&quot;
		    xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot;
		    xmlns:trackback=&quot;http://madskills.com/public/xml/rss/module/trackback/&quot;&gt;
       &lt;rdf:Description
	        rdf:about=&quot;http://minujang.egloos.com/2254211&quot;
	        dc:identifier=&quot;http://minujang.egloos.com/2254211&quot;
	        dc:title=&quot;리스트컨트롤 작업시 유용한것들.&quot;
	        trackback:ping=&quot;http://minujang.egloos.com/tb/2254211&quot;/&gt;
       &lt;/rdf:RDF&gt;
       --&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;div style='text-align: center; margin: 10px auto; height: 91px; overflow: hidden; clear: both;'&gt;&lt;iframe title='mixUP 위젯' src='http://mixsh.com/widget/new_mixup/loader_plugin.html?domain=sanaigon.tistory.com&amp;media_type=10&amp;guid=sanaigon.tistory.com%2F149&amp;regts=1322642776&amp;showhitcnt=1&amp;platform=10' frameBorder='0' scrolling='no' allowTransparency='true' width='402' height='130'&gt;&lt;/iframe&gt;&lt;/div&gt;</description>
			<category>Windows Programming (MFC)</category>
			<author>J.K 스나이퍼</author>
			<guid>http://sanaigon.tistory.com/149</guid>
			<comments>http://sanaigon.tistory.com/149#entry149comment</comments>
			<pubDate>Wed, 30 Nov 2011 17:46:16 +0900</pubDate>
		</item>
		<item>
			<title>CTreeCtrl의 초기화(OnInitdialog)시에 SetCheck() 함수가 먹지 않는 문제</title>
			<link>http://sanaigon.tistory.com/148</link>
			<description>&lt;P&gt;TVS_CHECKBOXES 스타일을 가지고 있는 CTreeCtrl을 쓰다가 특정 값을 받아 초기화 하는 과정에서 SetCheck()함수를 통해 체크 상태로 만들려고 하는데 분명 반환 되는 값은 TRUE로 정상적으로 함수는 동작을 하였으나, Check이미지 상태로 변하지 않아서.. 한참을 고민 하였다. &lt;br /&gt;
&lt;br /&gt;구글링을 통해 검색한 결과 나와 같은 어려움을 겪는 많은 사람들이 있었는데, 그중에 가장 간단한 해결 방법이 있어 소개 하고자 한다. &lt;br /&gt;
&lt;br /&gt;사용방법은 간단 하다 OnInitDialog()함수에서 SetCheck()함수를 사용하기 전에 아래의 두줄을 라인을 입력한다. &lt;br /&gt;
&lt;br /&gt;m_ctrlTree.ModifyStyle( TVS_CHECKBOXES, 0 );&lt;br /&gt;
m_ctrlTree.ModifyStyle( 0, TVS_CHECKBOXES );&lt;br /&gt;
&lt;br /&gt;위의 함수는 윈도우 프로그래밍을 하는 사람이라면 누구나 알고 있을법한 함수로 특정 윈도우 스타일을 제거하고 추가 하는 함수이다. &lt;br /&gt;
&lt;br /&gt;이 함수를 SetCheck()함수 전에 한번 호출 해 준후에 원래 구현을 하면 기대하던 동작을 할 수 있을 것이다. &lt;br /&gt;
이유는 여러가지가 있다고는 하나 정확한 이유는 잘 모르겠다. &lt;br /&gt;
&lt;br /&gt;나와 같은 삽질하시는 분들께 도움이 됬으면 좋겠다. &lt;br /&gt;
&lt;br /&gt;참고 : &lt;A href=&quot;http://www.codeguru.com/forum/archive/index.php/t-197692.html&quot;&gt;http://www.codeguru.com/forum/archive/index.php/t-197692.html&lt;/A&gt;&lt;br /&gt;
&lt;/P&gt;&lt;div style='text-align: center; margin: 10px auto; height: 91px; overflow: hidden; clear: both;'&gt;&lt;iframe title='mixUP 위젯' src='http://mixsh.com/widget/new_mixup/loader_plugin.html?domain=sanaigon.tistory.com&amp;media_type=10&amp;guid=sanaigon.tistory.com%2F148&amp;regts=1312802254&amp;showhitcnt=1&amp;platform=10' frameBorder='0' scrolling='no' allowTransparency='true' width='402' height='130'&gt;&lt;/iframe&gt;&lt;/div&gt;</description>
			<category>Windows Programming (MFC)</category>
			<author>J.K 스나이퍼</author>
			<guid>http://sanaigon.tistory.com/148</guid>
			<comments>http://sanaigon.tistory.com/148#entry148comment</comments>
			<pubDate>Mon, 08 Aug 2011 20:17:34 +0900</pubDate>
		</item>
		<item>
			<title>시스템의 각종 상태를 파악 할 수 있는 함수 SystemParametersInfo()</title>
			<link>http://sanaigon.tistory.com/147</link>
			<description>&lt;H1&gt;&lt;A name=base.systemparametersinfo&gt;&lt;/A&gt;SystemParametersInfo Function&lt;/H1&gt;
&lt;P&gt;
&lt;P&gt;Retrieves or sets the value of one of the system-wide parameters. This function can also update the user profile while setting a parameter.&lt;/P&gt;
&lt;DIV&gt;&lt;PRE class=syntax xml:space=&quot;preserve&quot;&gt;BOOL WINAPI SystemParametersInfo(
  __in          UINT &lt;I&gt;&lt;A class=synParam href=&quot;&quot;&gt;uiAction&lt;/A&gt;&lt;/I&gt;,
  __in          UINT &lt;I&gt;&lt;A class=synParam href=&quot;&quot;&gt;uiParam&lt;/A&gt;&lt;/I&gt;,
  __in_out      PVOID &lt;I&gt;&lt;A class=synParam href=&quot;&quot;&gt;pvParam&lt;/A&gt;&lt;/I&gt;,
  __in          UINT &lt;I&gt;&lt;A class=synParam href=&quot;&quot;&gt;fWinIni&lt;/A&gt;&lt;/I&gt;
);&lt;/PRE&gt;&lt;PRE class=syntax xml:space=&quot;preserve&quot;&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE class=syntax xml:space=&quot;preserve&quot;&gt;현재 시스템의 상태를 파악 하고자 하는 uiAction값을 매개변수로 넘겨 주변 pvParam 값으로 현재의 상&lt;/PRE&gt;&lt;PRE class=syntax xml:space=&quot;preserve&quot;&gt;태를 넘겨받을 수 있다. &lt;/PRE&gt;&lt;PRE class=syntax xml:space=&quot;preserve&quot;&gt;출처 : &lt;A href=&quot;http://msdn.microsoft.com/en-us/library/ms724947(v=vs.85).aspx&quot;&gt;http://msdn.microsoft.com/en-us/library/ms724947(v=vs.85).aspx&lt;/A&gt;&lt;/PRE&gt;&lt;/DIV&gt;&lt;div style='text-align: center; margin: 10px auto; height: 91px; overflow: hidden; clear: both;'&gt;&lt;iframe title='mixUP 위젯' src='http://mixsh.com/widget/new_mixup/loader_plugin.html?domain=sanaigon.tistory.com&amp;media_type=10&amp;guid=sanaigon.tistory.com%2F147&amp;regts=1310016626&amp;showhitcnt=1&amp;platform=10' frameBorder='0' scrolling='no' allowTransparency='true' width='402' height='130'&gt;&lt;/iframe&gt;&lt;/div&gt;</description>
			<category>Windows Programming (MFC)</category>
			<author>J.K 스나이퍼</author>
			<guid>http://sanaigon.tistory.com/147</guid>
			<comments>http://sanaigon.tistory.com/147#entry147comment</comments>
			<pubDate>Thu, 07 Jul 2011 14:30:26 +0900</pubDate>
		</item>
		<item>
			<title>CBitmap을 이용한 비트맵 파일 로드 방법</title>
			<link>http://sanaigon.tistory.com/146</link>
			<description>&lt;PRE&gt;&lt;FONT color=#990000&gt;&lt;TT&gt;
BOOL CMyBitmap::LoadBitmap(LPCTSTR szFilename) 
{ 
	ASSERT(szFilename);
	DeleteObject();

	HBITMAP hBitmap = NULL; 
	hBitmap = (HBITMAP)LoadImage(NULL, szFilename, IMAGE_BITMAP, 0, 0, 
		LR_LOADFROMFILE | LR_CREATEDIBSECTION | LR_DEFAULTSIZE); 
	return Attach(hBitmap); 
}&lt;/TT&gt;&lt;/FONT&gt;&lt;/PRE&gt;&lt;br /&gt;&lt;div style='text-align: center; margin: 10px auto; height: 91px; overflow: hidden; clear: both;'&gt;&lt;iframe title='mixUP 위젯' src='http://mixsh.com/widget/new_mixup/loader_plugin.html?domain=sanaigon.tistory.com&amp;media_type=10&amp;guid=sanaigon.tistory.com%2F146&amp;regts=1306286050&amp;showhitcnt=1&amp;platform=10' frameBorder='0' scrolling='no' allowTransparency='true' width='402' height='130'&gt;&lt;/iframe&gt;&lt;/div&gt;</description>
			<category>Windows Programming (MFC)</category>
			<author>J.K 스나이퍼</author>
			<guid>http://sanaigon.tistory.com/146</guid>
			<comments>http://sanaigon.tistory.com/146#entry146comment</comments>
			<pubDate>Wed, 25 May 2011 10:14:10 +0900</pubDate>
		</item>
	</channel>
</rss>
