전체 글 389

cast 연산자 사용하여 signed , unsigned 상호 형변환시 매우 주의가 필요

부호 없는 수, 부호 없는 수를 형 변환하거나 형 확장시에 매우 주의해야 된다. 문자열 관련 처리를 하는 과정에서 각각의 1바이트 char형 문자들을 계산하기 편하게 4바이트로 확장시켜서 연산을 하는데 의도하지 않았던 결과가 나와서 디버그해보니 그동안 형 변환에 대해 좀 착각해왔음을 알 수 있었다. char a = 0xB1; // ( 128보다 크므로 실제로는 음수값이다.) unsinged int b = (unsigned int)a; 혹은 unsinged int b = a; 여기서 b에는 0xB1이 아니라 0xFFFFFFB1 값이 들어간다. 일단 int형으로 변환을 먼저 시킨 후 unsigned로 변환하는 듯 하다. 위에서 b에 0xB1 값을 대입하고자 하는 목적인 경우에는 unsigned int b =..

C, C++ 문법 2011.07.21

SetCapture 특기할만한 사항

SetCapture API의 경우 보통 마우스가 윈도우 영역을 벗어나더라도 계속 마우스 무브 메시지를 받을 필요가 있는 경우 사용한다. ReleaseCapture하면 설정된 캡쳐가 해제된다. 이건 윈도우 이동시의 윤곽선 변경 테스트해보다가 발견한 것인데 윈도우의 프레임이나 메뉴, 캡션 등 논클라이언트 영역에서 마우스 이동할 경우에도 SetCapture 함수를 사용하면 WM_MOUSEMOVE로 메시지가 온다. 참고로 논클라이언트 영역에서 마우스 이동시 원래는 WM_NCMOUSEMOVE가 발생한다. 따라서 일단 SetCapture를 사용하면 어떤 영역에 있든 WM_MOUSEMOVE가 오게되므로 위 메시지처리부에서 일괄적으로 코딩할 수 있어서 편하다.

API 2011.07.16

SetROP2 이용하여 반전효과 사용시 주의사항

SetROP2에서 R2_NOT이나 R2_XORPEN를 줘서 반전효과를 이용하면 이전의 선들을 지우면서 이동할 수 있다. 그런데 기존에 인터넷에 돌아다니는 소스에는 좀 문제가 있다. 마우스 왼쪽 버튼 다운 메시지가 오면 파라미터로 전달된 좌표와 old x, old y 좌표를 일치시켜서 처리하는 식인데 이 경우 마우스 무브 첫 메시지 발생하고 그리는 과정에서 문제가 생긴다. 선을 그리는 함수의 좌표가 같은 경우, 가령 (100, 100) ~ (100, 100) 까지 선을 그린다고 하면 100, 100 위치에 선 굵기만한 점이 그려진다. 그래서 첫 마우스무브 메시지에서 일단 선굵기 크기의 점을 그리고 그 다음에 시작지점부터 마우스무브 좌표까지의 선을 그린다. 이 결과 첫 점 부분이 다시 반전이 되어 원래의 배..

API 2011.07.12

비트 연산의 이해와 활용

비트연산자에는 다음과 같은 것들이 있다. ~ & | ^ > ~, &, | 연산자의 경우는 사용도가 높고 직관적으로 이해가 잘 된다. 훌륭한 사용예로 윈도우 스타일 변경을 들 수 있다. GetWindowLong, SetWindowLong으로 얻거나 변경이 가능하다. 위 API에서 스타일 결과값이나 인수는 DWORD 형 4바이트로 특정 비트에 각각의 속성을 매칭시키는 식이다. 윈도우 스타일뿐 아니라 소위 각종 속성이나 플래그는 이런 식으로 처리한다. 가령 WS_VISIBLE 속성은 총 32비트 중에 어느 곳을 지정해서 그곳의 비트가 1이면 해당속성을 가진 것으로 인식하는 것이다. 스타일이 4바이트(32비트)면 총 32개 속성을 주는 게 가능하다. 여담으로 이게 부족했던지 CreateWindowEx에서는 첫번..

C, C++ 문법 2011.07.10

GetAsyncKeyState 올바른 이해

위 API를 쓸 데가 있어서 구글링하다가 잘못된 정보가 많이 포스팅된 걸 볼 수 있었다. 리턴값은 short 형이고 최상위 비트는 현재 눌린지를 말해주고 최하위 비트는 이전에 눌렀던 적이 있는지를 말해준다. 리턴값이 0, 0x8000, 0x8001, 1 이렇게 4가지가 가능하다. 그런데 대부분 잘못된 포스팅에서는 호출시 안 눌린 상태면 결과값이 0이라고 해놨는데 틀린 설명이다. 가령 이전 GetAsyncKeyState('A')가 실행되고 0.5초 후 A키를 눌렀다 뗀 상태이고 다음 GetAsyncKeyState('A')를 실행한 경우 1을 리턴한다. 각 리턴값에 따른 상황은 다음과 같이 설명될 수 있다. 0: 이전에 누른 적이 없고 호출시점에 안 눌린 상태 0x8000: 이전에 누른 적이 없고 호출시점에..

API 2011.07.07

mov와 lea 명령어 차이

mov는 좌변에 우변(혹은 상수)의 값을 입력하는 것이다. lea는 좌변(레지스터만 가능)에 우변의 주소값을 입력하는 것이다. mov eax, dword ptr ss:[ebp-4]; 위의 경우 eax는 ebp-4 메모리 주소에 있는 4바이트(dword)값이 입력될 것이다. 참고로 dword ptr ss:[ebp-4];에서 [주소]는 주소에 존재하는 값을 의미한다. dword ptr에 의해 4바이트 의 값을 읽어들인다. word ptr이면 2바이트, byte ptr이면 1바이트를 읽어들인다. mov는 값을 입력하는 것이므로 mov eax, 12345(상수) 문장은 당연히 성립가능하다. mov dword ptr ss:[esp-4], 12345; mov dword ptr ds:[0x00560033], 1234..

Assembly 2011.02.27

분할 소스 작성

한 cpp 파일 소스가 너무 길면, 관리는 그렇다 쳐도, 비주얼 스튜디오 에디터가 제대로 작동하지 않는다. 분할 소스로 작성하지 않고 복사-붙여넣기 신공으로 하나의 cpp에 마구 집어 넣었더니,,, 어느새 텍스트 용량이 1메가가 넘는다. 비주얼 스튜디오 에디터가 제대로 작동하지 않는다. 에디터에서 함수 이름을 치면 해당 함수로 가는 편리한 기능이 있는데 소스가 길어서 인지 이러한 인덱싱이 제대로 작동하지 않는다. 엉뚱한 곳에 가버린다. 그리고 도저히 못 참는 건 소스의 마지막 부분에 가서 편집하려고 하면 버벅이는 사태가 일어난다. 문자를 입력하거나 엔터를 치거나, 복사, 붙여넣기 작업을 하려고 하면 심심찮게 20초간 먹통이 되었다가 반응한다. 어처구니 없는 사태다. 분할 소스 작성을 정리해 본다. ===..

카테고리 없음 2011.01.05

kt 인터넷 전화기에 딸려오는 쿡허브(유, 무선 공유기) 설정 유의점

이번에 ftth와 인터넷 전화기를 같이 신청했는데, (그냥 인터넷만 신청하는 것보다 가격할인이 크다..;;;) 이름은 쿡허브로 지은 듯 하다. 물론 무선공유기 역할도 충실히 수행한다. n방식까지 지원한다고 적혀있다. lg에서 공짜로 주는 무선공유기는 g방식까지 밖에 지원안한다. n방식으로 연결가능한 노트북에서 무선연결해보니 72메가로 연결되었다는 메시지가 보인다. 이전 lg 공유기로 사용했던 g방식은 54메가?연결이 최고상태였다. 실제 속도 테스트하니 업, 다운 모두 초당 2.5메가 정도 나오는데 g방식 최고 속도도 이와 비슷한 것 같던데~~~;;; 디폴트 설정은 사용자 계정/암호, 무선랜 암호가 모두 같다. 그러므로 이것을 변경해주는 것이 좋다. 인터넷 전화기 설치하신 분에게 암호설정이 있느냐고 물어봤..

카테고리 없음 2010.08.17