API 73

프로세스, 스레드간의 상호 통신에 주의해야 될 점

어떤 프로그램을 만들어서 타겟 프로그램을 조종한 적이 있는데, 이게 심심찮게 먹통이 되는 것이다. 이것저것 테스트해보니 타겟프로그램에 먹통이 생긴 경우 조종 프로그램도 같이 먹통이 되는 것이었다. 조사해보니 SendMessage와 같이 타겟프로그램에서 결과값을 보내 줄 때까지 대기하는 동기적인 함수가 문제였다. 타겟 프로그램이 먹통이 되버리니 처리가 안되어 결과값을 보내지 못하고 따라서 조종 프로그램도 계속 멍청히 대기하는 것이다. 그래서 결과값이 필요 없는 행동의 경우 PostMessage를 사용하고 (PostMessage는 타겟 윈도우를 소유한 스레드의 메시지 큐에 메시지를 넣고 바로 리턴한다.) 결과값이 필요한 경우는 SendMessageTimeout API를 사용하는 게 좋다. 이 함수는 일정시간..

API 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

GetAsyncKeyState 올바른 이해

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

API 2011.07.07

멀티미디어 프로그래밍 참조

멀티미디어 프로그래밍 제1장 WAV 파일을 작동하자 ⼗ 20 ⼗ 멀티미디어란 과연 어디까지이고 어떤 것들이 있는 것일까? 멀티미디어란 동영상, 음악, 텍스트를 자유자재로 이용할 수 있는 매체라고 말할 수 있습니다. 여기에 통신, TV, HOME AUTOMATION 등 각종 기능을 내재하고 상호 대화를 할 수 있는 컴퓨터를 말하기도 합니다. 윈도 95에서는 쉽게 멀티미디어 프로그래밍을 할 수가 있습니다. 윈도 95에서는 MCI(Media control Interface) 서비스를 제공하기 때문에 프로그래머는 MCI만 조절함으로써 영상과 음성을 조작할 수 있습니다. MCI에서 제공하는 매체들은 음성 파장 파일(*.WAV), CD-AUDIO, 동영상 파일(*.AVI), 각종 비디오 매체 등등 입니다. 이런 매..

API 2010.04.09

midi 파일 프로그래밍 참조

///////////////////////////////////////////winapi.co.kr 질답글 중~~~MDI는 아니고 MCI 입니다. API정복 책이 있다면. 그 책에도 간단히 나와 있긴 합니다. 물론 개정판의 경우는 VOLUME 2 에 있습니다. MCI.. 사실 당장 필요한 함수는 두개 뿐입니다. 그것도 명령 메시지 방식에 하나... 명령 문자열 방식에 하나.. 즉 둘중에 한개만 쓰면 됩니다. 명령 메시지 방식의 경우는 mciSendCommand.. 명령 문자열 방식의 경우는 mciSendString... 명령 메시지 방식의 경우는.. 윈도우 프로시저 방식과 똑같습니다... 메시지 상수값으로 구분하고.. 나머지 몇몇 인자들에.. 여러 데이터를 구겨넣든지.. 포인터 타입을 캐스팅 하든지.. ..

API 2010.04.09

전역 스레드 핸들을 다룰시 유의사항

HANDLE hThread=CreateThread~~~; CloseHandle(hThread); 이런식으로 쓰이는데,,, 전역변수 핸들을 선언하는 경우 좀 유의해야 할 듯 하다. HANDLE g_ahThread[64]={NULL,}; g_ahThread[index]=CreateThread~~~; ... ... .. TerminateThread(g_ahThread[index], 0); CloseHandle(g_ahThread[index]); 형식으로 쓰이는데. 핸들을 닫은 후 g_ahThread[index]=NULL;이라는 코딩을 해주는게 좋다. 스레드의 핸들은 조사해 보니 0x7bc 이런식으로 아주 낮은 자리수를 취하고 있었다. 어떤 스레드를 닫은 경우, 그 핸들 번호가 새로 생성된 스레드에 할당되는 일..

API 2010.03.16

TerminateThread사용시 생존여부 판단 주의(GetExitCodeThread 사용시 리턴값 주의)

TerminateThread 로 강제종료시킬 경우,,, 스레드가 종료작업을 모두 마친 후에 리턴되지 않고, 커널에 종료시키라는 신호만 보내고 바로 리턴하는 듯하다.(이를테면 비동기적 처리) DWORD WINAPI ThreadFun(LPVOID lp) { Sleep(3000); return 0; } { DWORD tid; HANDLE hOneThread=CreateThread(NULL, 0, ThreadFun, NULL, 0, &tid); DWORD dwExitCode=NULL;TerminateThread(hOneThread, 0x9999); BOOL bSuc=GetExitCodeThread(hOneThread, &dwExitCode); char szText[256]={0}; wsprintfA(szText..

API 2010.03.16