프로그래밍 강의 (68)
위 스크립트는 문자열 변수를 어떤 문자열을 기준으로 자르는 스크립트입니다. 예를 들어 문자열 변수가 "a,b,c,d" 일 때, 스크립트(문자열 변수, ",") 를 하게 되면 return_str 배열에 abcd 가 차곡차곡 들어가게 됩니다. 이 스크립트는 리턴 값으로 커트 기준 문자열의 개수를 반환합니다. ///문자열 변수를 문자열을 기준으로 자르는 스크립트 var str, pos, count, i; str = argument0 pos = 0 count = string_count(argument1, argument0) for(i=0; i
메모리 누수란 무엇일까요? 보통 우리가 함수에서 선언하여 쓰는 지역변수는 함수가 끝나면 사라지게 되어있습니다. 지역변수가 속한 곳을 스택 공간이라고 부르지요. 우리가 메모리를 제어할 때 사용하는 malloc, new 등은 힙 공간에 자리 잡으면서, 할당을 하면 해제를 시키게끔 프로그래머에게 권하고 있습니다. 이런 해제가 제대로 이뤄지지 않으면 프로그램이 종료되어도 해당 메모리 공간은 계속 차지하게 되고 이것이 쌓이고 쌓여서 메모리 부족현상을 일으킬 수 있습니다. * 비슷한 맥락의 '버퍼 오버플로우' 도 있습니다. 이것은 사용자가 설정한 범위 밖으로 메모리를 침범하는 행위를 일컫습니다. 아무튼, 자신의 프로그램에서 메모리 누수가 발생한 것을 보다 손쉽게 알고 싶다면 여러 가지 방법이 있습니다. 디버거를 하..
HINSTANCE hHookDll=NULL; HHOOK hHook=NULL; LRESULT CALLBACK GetMsgProc(int code, WPARAM wParam, LPARAM lParam) { MSG *msg=(MSG*)lParam; switch(msg->message) { default: ; } return CallNextHookEx(hHook, code, wParam, lParam); } extern "C" BOOL APIENTRY DllMain(HINSTANCE hInst, DWORD reason, LPVOID reserved) { switch(reason) { case DLL_PROCESS_ATTACH: { if(hHookDll==NULL){hHookDll=hInst;} break; } ..
WNDPROC oldProc; HWND hWnd=NULL; LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { switch(message) { default: ; } return CallWindowProc(oldProc, hwnd, message, wParam, lParam); } extern "C" BOOL APIENTRY DllMain(HINSTANCE hInst, DWORD reason, LPVOID reserved) { switch(reason) { case DLL_PROCESS_ATTACH: { if(hWnd==NULL) { //hWnd = ~ oldProc=(WNDPROC)SetWindowLongPt..
void set_composition_window(int xpos, int ypos) { if(hIMC=ImmGetContext(hWnd)) { COMPOSITIONFORM cf; cf.dwStyle=CFS_POINT; cf.ptCurrentPos.x=xpos; cf.ptCurrentPos.y=ypos; ImmSetCompositionWindow(hIMC, &cf); ImmReleaseContext(hWnd, hIMC); } } 한글 조합 상자의 위치를 바꿔줍니다. 단, 한글 조합 상자의 윈도우는 계속 생겨나고 파괴되기 때문에 수시로 바꿔주어야 합니다. 아예 박스 윈도우가 생성되지 않게 하시려면, IME 메시지 중 WM_IME_STARTCOMPOSITION 메시지가 오면 메시지를 넘기지 않고 return..
아래의 두 가지 방법이 있습니다. 엮인 글: IME 한/영 상태 얻기 void set_language(double mode) { if(hIMC=ImmGetContext(hWnd)) { ImmNotifyIME(hIMC, NI_COMPOSITIONSTR, CPS_CANCEL, 0); DWORD dwConv, dwSent, dwTemp; BOOL bRet=ImmGetConversionStatus(hIMC, &dwConv, &dwSent); if(bRet) { dwTemp=dwConv & ~IME_CMODE_LANGUAGE; if(mode==0){dwTemp |= IME_CMODE_ALPHANUMERIC;} else{dwTemp |= IME_CMODE_NATIVE;} dwConv=dwTemp; ImmSetCon..
아래의 두 가지 방법이 있습니다. 엮인 글: IME 한/영 상태 전환하기 int get_language() { BOOL bRet=FALSE; if(hIMC=ImmGetContext(hWnd)) { DWORD fdwConversion, fdwSentence; BOOL bRet2=ImmGetConversionStatus(hIMC, &fdwConversion, &fdwSentence); if(bRet2){bRet=(fdwConversion & IME_CMODE_NATIVE ? TRUE : FALSE);} ImmReleaseContext(hWnd, hIMC); } return bRet; } int get_language() { BOOL bRet=FALSE; if(hIMC=ImmGetContext(hWnd)) {..
void set_string_ansi(char *str) { if(hIMC=ImmGetContext(hWnd)) { ImmSetCompositionStringA(hIMC, SCS_SETSTR, str, strlen(str)+1, NULL, 0); ImmReleaseContext(hWnd, hIMC); } } IME 한글 조합 박스에 있는 한글을 바꾸는 코드입니다. ImmSetCompositionStringA 는 아스키코드 문자열을, ImmSetCompositionStringW 는 유니코드 문자열을 의미합니다. 두 개의 함수 중 골라서 쓰시면 됩니다. 엮인 글: IME Composition Window 내용 얻기
char char_ansi[3]={0,}; void get_string_ansi() { char_ansi[0]=NULL; if(hIMC=ImmGetContext(hWnd)) { ImmGetCompositionStringA(hIMC, GCS_COMPSTR, char_ansi, ImmGetCompositionStringA(hIMC, GCS_COMPSTR, NULL, 0)); ImmReleaseContext(hWnd, hIMC); } } IME 한글 조합 박스에 있는 한글을 얻는 코드입니다. ImmGetCompositionStringA 는 아스키코드의 문자열을, ImmGetCompositionStringW 는 유니코드 형식의 문자열을 반환합니다. 엮인 글: IME Composition Window 내용 바꾸기
HWND hWnd=NULL; void get_hwnd() { if(hWnd==NULL) { ULONG idProc; DWORD TempCurrProcId=GetCurrentProcessId(); hWnd=FindWindow(NULL, NULL); while(hWnd!=NULL) { if(GetParent(hWnd)==NULL) { GetWindowThreadProcessId(hWnd, &idProc); if(TempCurrProcId==idProc){break;} } hWnd=GetWindow(hWnd, GW_HWNDNEXT); } } } 프로세스 ID 를 이용한 최상위 핸들을 구하는 방법입니다. hWnd 전역변수에 핸들이 구해집니다.