2018. 11. 29. 17:03

VS2010에서 VS2015로 마이그레이션하면 다음과 같은 버그가 생성된다.

LNK2001  _vsnprintf 외부 기호를 확인할 수 없습니다

 

그럴 때는 이전 라이브러리가 호환되지 않기 때문에 그렇다

 

속성 - 구성 속성 - 링커 - 입력 - 추가 종속성 

 

에 다음을 추가한다

 

legacy_stdio_definitions.lib

 

 

2018. 11. 16. 10:22



CWnd를 상속받아 CWnd를 그려주고 색상을 변경한다


그런데 일반 객체를 생성하면 윈도우가 안 그려지고


new를 이용하여 객체를 생성해야 OnDraw( ) 함수가 호출되어 그려진다


왜 그럴까?

2018. 8. 24. 11:08

트리에서 부모를 선택하면 자식 아이템 모두 선택 함수






트리에서 항목을 선택하는 함수



2018. 8. 23. 15:26

디버깅할 때 Break Point 가 걸리지 않고 하얀색으로 변경되면 


여러 가지 이유가 있지만 


PDB 파일이 생성되지 않을 때가 있다


그럴 때는 속성 창에서 다음과 같이 설정한다.



프로젝트 - 속성 - 링커 - 디버깅 - 디버그 정보 생성 - 예(/DEBUG)




2018. 7. 17. 15:51

m_listCtrl.SetItemState(nIndex, LVIS_SELECTED, LVIS_SELECTED);



nIndex : 해당 선택 줄 (0번부터 시작)

2018. 7. 3. 16:52

https://www.codecademy.com/welcome/find-a-course

2018. 7. 3. 15:25

보기 - 탐색창 - 제목


이게 이렇게 어려운가...

2018. 6. 15. 11:24

윈도우 설치할 때 콘솔 창 띄우기



Shift + F10



누르면 됩니다.


콘솔 창 한 페이지 씩 넘기기


dir | more



Enter - 한 줄씩


Space - 한 페이지씩 

2018. 5. 17. 10:36


2018. 4. 20. 20:51

컨트롤을 업데이트 하기 전에 다음 함수를 넣어준다



LockWindowUpdate();



모든 컨트롤을 업데이트 하고 나서 다음 함수로 해제한다



UnlockWindowUpdate();



그러면 깜빡임이 발생하지 않는다

2018. 2. 9. 11:05

훅 체인에 등록되어 메시지를 감시하는 함수를 훅 프로시저(Hook Procedure)라고 한다


훅 타입에 따라 훅 프로시저의 인수나 리턴값의 의미는 달라지지만 원형은 고정되어 있다


다음은 WH_KEYBOARD 타입의 키보드 훅 프로시저인데 다른 타입의 훅 프로시저도 이름만 다르고 원형은 동일하다


LRESULT CALLBACK KeyboardProc( int code, WPARAM wParam, LPARAM lParam);


훅 프로시저는 응용 프로그램이 제공하는 콜백함수이므로 원형만 제대로 지킨다면 이름은 마음대로 정할 수 있다


세 개의 인수


1. code : 훅 프로시저에서 이 메시지를 어떻게 처리할 것인가를 지정

           이 값이 음수이면 훅 프로시저는 이 메시지를 처리하지 말고 다음

           훅 프로시저에게 메시지를 넘김


2. wParam : 메시지 추가 정보


3. lParam : 메시지 추가 정보


훅 프로시저를 설치할 때는 다음 함수를 사용한다


HHOOK SetWindowsHookEx

( int idHook, HOOKPROC lpfn, HINSTANCE hMod, DWORD dwThreadId );



1. idHook : 설치하고자 하는 훅의 타입을 지정

              WH_로 시작되는 매크로 상수중 하나를 사용


2. lpfn : 훅 프로시저의 번지


3. hMod : 훅 프로시저를 가진 인스턴스 핸들


4. dwThreadId : 훅 프로시저가 감시할 스레드의 ID

                   이 값이 0이면 시스템의 모든 스레드에서 발생하는 메시지가 훅                     프로시저로 전달



자신의 메시지를 훅킹할 때는 GetCurrentTrheadId 함수로 현재 스레드의 ID를 넘긴다


시스템의 모든 메시지를 감시하고자 한다거나 다른 프로그램의 메시지를 감시하고자 할 경우 lpfn은 반드시 분리된 DLL에 있어야 하며 이 때 hMod는 이 DLL의 핸들이어야 한다


다음은 지역 훅과 전역 훅을 설치하는 일반적인 방법이다


지역 훅 : SetWindowsHookEx( idHook, lpfn, NULL, GetCurrentThreadId() );


전역 훅 : SetWindowsHookEx( idHook, hpfn, hDll, 0 );



SetWindowsHookEx 함수는 훅 프로시저를 설치한 후 HHOOK 타입의 훅 핸들을 리턴하는데 이 핸들은 해제를 위해 전역 변수에 잘 보관해 두어야 한다


만약 에러가 발생했ㄷ사면 NULL 을 리턴한다


훅 프로시저를 해제하는 함수는 다음과 같다


BOOL UnhookWindowsHookEx( HOOK hhk );


해제하고자 하는 훅 핸들을 인수로 전달하는데 이 핸들은 설치할 때 받은 값이다


훅을 설치한 프로그램은 종료되기 전에 반드시 훅 프로시저를 해제해야 한다


훅 프로시저가 설치되면 해당 타입의 메시지는 목표 윈도우로 보내지기 전에 훅 프로시저에게 먼저 전달되는데 훅 프로시저는 메시지를 살펴본 후 특별한 이유가 없으면 메시지를 훅 체인의 다음 훅 프로시저에게 전달해야 한다


이 때는 다음 함수를 사용한다


LRESULT CallNextHookEx( HHOOK hhk, int nCode, WPARAM wParam, LPARAM lParam);


hhk 는 현재 처리하고 있는 훅의 핸들인데 SetWindowsHookEx 함수가 리턴한 값이다












2018. 2. 8. 23:01

메시지 기반의 윈도우즈에서는 운영체에와 응용 프로그램, 또는 응용 프로그램 사이나 응용 프로그램 내부의 컨트롤끼리도 많은 메시지들을 주고 받는다


훅(Hook)이란 메시지가 목표 윈도우로 전달되기 전에 메시지를 가로채는 특수한 프로시저이다


오고 가는 메시지를 감시하기 위한 일종의 덫(Trap)인 셈인데 일단 응용 프로그램이 훅 프로시저를 설치하면 메시지가 윈도우로 보내지기 전에 훅 프로시저를 먼저 거친다


서브 클래스 프로시저와 마찬가지로 훅 프로시저에서는 메시지를 단순히 살펴보기만 할 수도 있고 메시지를 변경하거나 아예 없애버릴 수도 있다


훅 프로시저가 어떤 메시지를 받을 것인가는 훅의 타입과 범위에 따라 달라진다


훅 타입은 WH_ 로 시작되는 매크로 상수로 지정하는데 WH_HOUSE, WH_KEYBOARD 등 여러 가지가 있다


이름으로 유추할 수 있듯이 WH_HOUSE 훅은 마우스 메시지를 가로채고 WH_KEYBOARD 훅은 키보드 메시지를 가로챈다 


또한 훅은 메시지를 가로챌 범위에 따라 지역 훅 (Thread Specific)과 시스템 전역 훅(System Wide)으로 나누어진다


지역 훅은 특정 스테르에서 발생하는 메시지들만 전달 받으며 전역 훅은 시스템의 모든 스레드에서 발생하는 메시지를 가로챌 수 있다


응용 프로그램 자신의 메시지만 받고 싶을 때는 지역 훅을 사용하며 시스템에서 발생하는 모든 메시지를 받고자 할 때는 전역 훅을 설치해야 한다


훅 프로시저는  응용 프로그램이 자신의 필요에 따라 언제든지 설치할 수 있기 때문에 하나의 훅 타입에 대해 여러 개의 훅 프로시저가 존재할 수도 있다


그래서 운영체제는 설치된 훅 프로시저들을 훅 체인(Hook Chain) 으로 관리한다

훅 체인이란 훅 프로시저 함수들의 번지를 담고 있는 일종의 함수 포인터 배열이라고 할 수 있다


응용  프로그램이 훅 프로시저를 설치하면 운영체제는 훅 체인의 선두에 등록된 프로시저에게 이 메시지를 전달하고 훅 프로시저는 체인을 따라 다음 훅 프로시저에게 메시지를 연속적으로 전달하며 종국에는 그 메시지를 받을 윈도우에게 전달한다


물론 중간에서 메시지가 변형되거나 사라질 수도 있다


훅 프로시저가 설치되어 있으면 시스템은 메시지가 발생할 때마다 훅 프로시저에게 메시지를 전달한다


훅 체인에 여러 개의 훅 프로시저가 설치되어 있다면 메시지는 훅 체인 내의 모든 훅 프로시저를 거쳐야만 비로소 목표 윈도우로 전달될 수 있다


그래서 훅은 시스템의 전반적인 속도를 눈에 띄게 만든다


짧은 순간에 수백 개의 메시지가 처리되는데 이 메시지들이 훅 프로시저를 한 바퀴 돌아오려면 당연히 시간이 걸릴 수 밖에 없다


훅을 사용하는 디버거나 스파이 등의 툴을 띄워 놓으면 시스템이 느려지는 것을 직접 경험해 본 바 있을 것이다


그래서 훅은 꼭 필요할 때만 설치해야 하며 끝난 후에는 곧바로 제거하는 것이 좋다





2018. 2. 8. 14:38


setlocal enabledelayedexpansion


for /f "delims=" %%i in (%input_file) do (

    set one_line=%%i

    set var=!one_line:8,18!

    echo !var!

)



for 문 내에서는 %one_line% 대신 !one_line! 을 사용한다

2017. 12. 22. 14:46

네트워크 폴더로 접속하려면 다음과 같이 한다



net use [ip 주소] /user: [아이디] [암호]



예제 



set MyPath=\\100.120.12.247


net use %MyPath% /user: jmlee 1234



mkdir %MyPath%\재만재만



* 한글 경로가 깨지면 인코딩 UTF-8 대신 ANSI 로 NotePad++에서 변경




* 날짜


echo 날짜 : %date%

echo 시간 : %time%


set YEAR=%date:~0,4%

set MONTH=%date:~5,2%

set DAY=%date:~8,2%


echo %YEAR%

echo %MONTH%

echo %DAY%

pause





2017. 12. 18. 21:23


Windows 7 Professional 인지 Windows 7 Embedded 인지 확인하는 방법은


레지스트리에 등록된 정보를 얻어와야 한다



OS 이름은 다음 레지스트리에 있다


HKEY_LOCAL_MACHINE

    

    -  SOFTWARE


        - Microsoft

     

             - Windows NT


                 - CurrentVersion



에서 ProductName 에 있다



CString strvalue;

CRegKey key;


if (key.Open(HKEY_LOCAL_MACHINE, _T("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion")) == ERROR_SUCCESS)

{

DWORD size(256);

if (key.QueryStringValue(_T("ProductName"), strvalue.GetBuffer(size), &size) == ERROR_SUCCESS)

strvalue.ReleaseBuffer();


key.Close();

}



strValue 에 현재 OS 이름이 들어온다