이 포스팅은 가능한 원론에 가깝게 설명하는 데 목표가 있는 포스팅입니다. (이전 포스팅에서 이걸 안 지켜서.....) 이런 디자인 패턴을 도입하는 건 처리와 UI를 분리하기 위한 목적입니다. 이렇게 되면 처리 부분의 재사용성이 높아지기 때문입니다. MVC 디자인 패턴은 뷰/컨트롤러/모델로 나뉩니다. - 뷰 : UI/UX에 대한 사용자 입출력을 관리합니다. 모델의 상태를 표시하기 위해 모델과 연결됩니다. - 컨트롤러 : 사용자로부터 받은 입력을 가공하고 모델로 전달합니다. 이 과정에서 모델과 뷰가 연결됩니다. - 모델 : 전달받은 입력을 처리합니다. 뷰와 연결되었다면 모델이 뷰에 바로 업데이트를 요청할 수 있습니다. 아래와 같은 형태가 된다고 설명합니다. 위 이미지에서는 모델과 뷰가 연결된 것처럼 보이지만..
간만에 c++로 샘플을 만들었는데 에러가... error C3861: 'ShowScreen': 식별자를 찾을 수 없습니다. 1. 재연하기 아래 코드를 넣고 빌드하면 에러가 납니다. int _tmain(int argc, _TCHAR* argv[]) { ShowScreen(); return 0; } void ShowScreen() { char sData[255]; printf("--------------아무숫자나 입력하세요------------\n"); scanf( sData); } 2. 해결 방법 이건 초보적인 실수인데 헤더로 따로 관리하지 않는 경우 모든 메소드는 순차적으로 접근해야 합니다. B함수에서 A를 호출하기 위해서는 B함수보다 위에 A를 만들어야 한다는 것이죠. 다른 방법으로 상단에 함수원형을 ..
관련글 c++ DLL을 C#에서 사용해보자 ( 함수 마샬링 ) c++ DLL을 C#에서 사용해보자 ( 클래스 마샬링 ) 클래스 마샬링을 할일이 없엇 신경을 안쓰다가 요번에 스카이프 api나 제가 직접 마샬링 해볼까 해서 클래스 마샬링을 정리해 보았습니다. 근데 왜이렇게 자료가 없지? 겨우 찾은것이 비주얼C++ 팀블로그인데....네...영어입니다 ㅡ.-; (참고 : Visual C++ Team Blog - Inheriting From a Native C++ Class in C#) 일단 변환방법이 마음에 들지가 않아서 위글에 있는 내용을 그대로 사용하여 만들고 자료를 더 찾는다면 파트2로 돌아오 겠습니다 ㅎㅎㅎㅎ 그전에 이 글은 크게 2부분으로 나누어 설명할 예정입니다. 어찌됬건 프로그래머라면 일단 샘플부터..
이 글은 윈도우XP 기준입니다. 다른 운영체제에서는 해당 API가 작동하지 않거나 다른 동작을 할 수 있습니다. 제가 올린 대부분의 예제는 유니코드를 기준으로 합니다. (프로젝트 속성 -> 구성 속성 -> 일반 -> 문자 집합 -> 유니코드 문자 집합 사용) 'WinAPI'를 연습하기 참 좋은 소재가 메모장이죠 ㅎㅎㅎ 만만한게 메모장(으잌!) 1. 메모짱 어디 있니~ 메모장을 찾아 글을 출력해보겠습니다. 1-1. 적당한 곳에 변수 선언 //메모장의 핸들 저장용 HWND hwndNotepad; //차일드 핸들 저장용 HWND hwndNotepadChild; //이 문자열을 출력한다. LPCTSTR strText = L"메모짱 하악하악 (ㅡ.ㅡ;;;)"; 1-2. 적당한 곳에 출력 코드 입력 //메모장 핸들..
세상 살다 보면 별일이 다 발생한다지만 코딩 하다가 발생하는 난감함 중 하나가 사용자(여기서 말하는 사용자는 내가 만든 'dll'이나 클래스 등을 사용하는 사람을 말한다.)가 만든 코드를 호출해야 할 때입니다. 머.... 난감하다는 표현으로 하는 이유는 이런 방식은 내가 개발하고 있는 방향에서 반대로 간다고 생각하기 때문이지 별다른 뜻이 있는 건 아닙니다. ㅎㅎ (한마디로 심각하게 개인적인 견해라는 말씀) 1. 함수 포인터 콜백 이런 경우 흔gl 쓰는 방법이 함수 포인터를 이용한 콜백입니다. (CallBack) (닷넷에서는 델리게이트나 개체를 전달하여 구현 할 수 있죠.) 설명하자면.... 1) 클래스(dA) 내부에 사용자가 만든 함수의 포인터(dB)를 저장해둘 변수(?)를 만든다. 2) 사용자가 함수(..
C++에서 배열을 구하는 방법은 많습니다. 그중 포인터로 넘어온 배열의 개수를 구하는 방법을 알아보도록 하겠습니다. 1. 일반적으로 배열 구하는 방법 int a = inteof(Temp) / sizeof(Temp[0]); 그런데 이 방법은 정작 포인터로 넘어온 주소는 배열을 구하지 못합니다. 그래서 보통은 매개변수로 배열의 개수를 보내주는 방식을 많이 사용하죠. 어쩌면 당연한데.....'sizeof'는 변수의 크기를 리턴하므로 포인터를 넣으면 포인터의 대상이 아닌 포인터 자체의 크기를 리턴하기 때문입니다. (그래서 포인터를 위 코드로 구하면 '1'이 나옵니다.) 2. 포인터로 넘어온 배열 개수 구하는 방법 '_countof'를 이용하면 포인터로 넘어온 배열의 개수를 구할 수 있습니다. void Temp(..
어쿠.... 제가 진행하는 프로잭트는 거의 Win32프로젝트 입니다. 닷넷환경에 익숙한 저한테는 너무 가혹한 ㅜㅡ 어찌됬건 MFC조차 사용하면 안되는 환경에서 코딩을 하다보니 MFC로 된 자료를 보면 혈압이 올라서 정리해 둡니다. .txt 파일을 읽고쓰는건 기초중에 기초라고 할수 있는데도 불구하고 MFC자료만-_-;;; 1. 기본 쓰기 읽기 #include "stdafx.h" #include #include #include void LoadFile() { //*.txt에 쓰기 FILE *fp; fp = fopen("test.txt","wt"); fwrite("sddfsfasd", sizeof(char[10]), 1, fp); fclose(fp); //*.txt를 읽기 FILE *fp; int i = 0;..
1. 오류 error C2146: 구문 오류 : ';'이(가) 'PVOID64' 식별자 앞에 없습니다. 에러... 무려 winnt.h에서 나는 에러입니다 ㅡ,.ㅡ; 머 어쩌라는 겨 ㅎㅎㅎㅎ 2. 해결 방법 typedef void* PVOID; typedef void* POINTER_64; typedef void POINTER_64 PVOID64; 요걸 typedef void* PVOID; typedef void* POINTER_64; typedef POINTER_64 PVOID64; 요렇게 바꾸면 됩니다. 은근히 코드 3줄 다 뭔가 다르니, 그냥 3줄 한 번에 복사해서 쓰시길 권장합니다. 마무리 되도록 이해하면서 쓰면 좋지만..... 이해 못할 때는 그냥 따라 하는 것도 방법입니다 ㅎㅎㅎ
키보드 후킹을 해봤으니 마우스 후킹을 해봅시다. 연관글 영역 1. 훅(Hook) 설치 마우스 후킹은 키보드 후킹이랑 방식이 같습니다. 단지 훅을 설치할때 'WH_KEYBOARD_LL'대신 'WH_MOUSE_LL'를 사용해야 합니다. // 키보드 hook 설치 hKeyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, hInst, 0); // 마우스 hook 설치 hMouseHook = SetWindowsHookEx(WH_MOUSE_LL, LowLevelMouseProc, hInst, 0); 2. 마우스 좌표 얻기 마우스를 후킹 하여 좌표를 얻어옵시다. 이때 사용하는 API는 'GetCursorPos'입니다. (참고 : MS Learn -..
다른 포스팅에서 키보드 후킹을 해보았습니다. 그런데 'Ctrl + Alt + Del'만은 막아지질 않습니다. 연관글 영역 1. 가짜 'GINA'를 이용한 방법 98때는 약간의 꼼수를 써서 막을수 있었는데 NT계열은 그게 불가능합니다. 그래서 자료를 찾다가 찾은것이 가짜'GINA'를 이용한 Ctrl + Alt + Del호출을 막는 방법입니다. (참고 : GINA ) 이 방법은 원래는 OS가 'MSGINA'를 이용한여 'Ctrl + Alt + Del'를 호출하는 것을 자신이 만든 DLL을 통하여 'MSGINA'를 호출하게 한다음 'Ctrl + Alt + Del'가 들어오면 정보를 보내지 않는 방식으로 막는 것입니다. (참고 : http://www.devpia.com/MAEUL/Contents/Detail.a..