분류 전체보기
-
Windows 우클릭 메뉴 항목 추가Windows 프로그래밍 2019. 2. 18. 16:27
개발하다 보면 위와 같은 우클릭 시 나타나는 메뉴에 기능을 등록해야 할 때가 있다. 이를 잘 활용하면 더 퀄리티와 편의성이 높은 앱을 만들 수 있다.그럼 이제 여기에 어떻게 항목을 추가하고 어떻게 동작시키는지 알아보도록 하자. 일단 메뉴의 항목들은 모두 레지스트리의 컴퓨터\HKEY_CLASSES_ROOT\*\shell 경로에 저장되어 있다.레지스트리 편집기를 켜고 위 경로로 이동 후 shell 폴더에서 우클릭해 새로만들기->키 를 선택한다.원하는 키 이름을 입력하고 해당 키 기본값의 값 데이터를 우클릭 메뉴에 표시하고 싶은 이름으로 입력한다.아래와 같이 입력하면 첫 번째 사진처럼 Hello 라는 이름의 항목이 만들어진다. 항목을 추가하는데까진 성공했다. 이젠 이 항목을 선택했을 때 어떤 동작을 수행하게 ..
-
MFC 버튼 이미지로 바꾸기Windows 프로그래밍 2019. 2. 15. 17:26
Dialog 도구상자에서 버튼을 누르면 나오는 이런 못생긴 버튼..좀 예쁜 버튼을 가지고 싶다!!다행히도 MFC는 버튼 모양을 BMP 이미지로 바꿀 수 있는 기능을 제공하고 있다. 지금부터 알아보자. 버튼을 우클릭하고 속성을 누르면 아래와 같은 창이 생긴다. 그 중에서 표시한 부분을 보면 Owner Draw 라는 항목이 있다. 난 미리 바꿔나서 그런데 아마 False로 되어있을 것이다. 이것을 True로 바꿔준다. 그리고 다시 버튼을 우클릭해 변수 추가를 누른다. 변수 이름을 설정하고 변수 형식이 CButton으로 되어있을 것이다. 이걸 CBitmapButton으로 변경한다. 그 다음 원하는 bmp 이미지파일을 리소스 뷰에서 추가한다.그 다음 프로젝트이름Dlg.cpp로 가서 OnInitDialog()에 ..
-
리눅스 so 라이브러리의 개념과 생성 방법리눅스 2019. 2. 7. 10:22
Windows에는 dll(dynamic link library) 이라는 개념으로 동적 링크 라이브러리가 존재한다. 하지만 리눅스에는 dll이 존재하지 않는다. 그 대신 so 라는 개념이 있다. so에 대해 알아보기 전에 동적 라이브러리가 뭔지에 대해 먼저 알아보자. 우리는 프로그램을 개발할 때 여러 library를 가져다 쓰곤 한다. 동적 라이브러리와 정적 라이브러리의 차이점은 library를 로드하는 방법에서 나타난다. 동적 라이브러리는 프로그램 실행 중에 특정 library를 사용하고 싶을 때 로드하고, 정적 라이브러리는 프로그램에 library를 포함시켜 프로그램 시작 부터 library를 로드하게 된다. 물론 장단점이 있다. 동적 라이브러리 정적 라이브러리 장점 실행파일의 크기를 줄일 수 있다 실..
-
Windows 서비스 프로그램 개발 - 3Windows 프로그래밍 2019. 1. 8. 15:01
1탄에서 아래와 같은 과정을 보았을 것이다. 서비스 실행 > 서비스.exe > 서비스.exe에서 원하는 프로그램 실행 > 내가 원하는 프로그램 지금까지 첫 번째 단계를 끝냈다. 이제 서비스 exe를 작성해 볼 것이다. 나도 헷갈려서 여러 번 얘기하고 있다 ㅎ 서비스 내부에서는 내가 원하는 또다른 프로그램을 실행하는 작업이 이루어질 것이다.그러기 위해서 당연히 CreateProcess 함수를 쓸건데 그냥 쓸 순 없다.그냥 쓸 수 있다면 좋았을 텐데 Windows는 보안 정책이 많~이 깐깐한 것 같다. (그런데도 옆동네보다 바이러스도 많고 말이야.. 어??) CreateProcess 함수를 이용해서 프로세스를 열면 User 권한이 아닌 System 권한으로 접근하기 때문에 User만 접근할 수 있는요론거 다..
-
Windows 서비스 프로그램 개발 - 2Windows 프로그래밍 2019. 1. 8. 13:29
예에~ 2탄이다!!1탄에서 Create와 Start하는 함수를 살펴봤으니 2탄에서는 Stop과 Delete하는 함수에 대해 알아보자. Stop 과정 BOOL CService::StopServiceProc(WCHAR *ServiceName) { CString ErrorString; SC_HANDLE SCMhandle = NULL; SC_HANDLE OpenSChandle = NULL; SCMhandle = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS); if (SCMhandle == NULL) { int Err = GetLastError(); ErrorString.Format(L"Stop OpenSCManager : %d", Err); AfxMessageBox(..
-
Windows 서비스 프로그램 개발 - 1Windows 프로그래밍 2019. 1. 8. 13:22
서비스 프로그램을 개발하게 되었는데 너무 길 것 같아서 나눠서 적어야겠다.서비스는 admin 권한이 필요한 프로그램이지만 사용자에게 허용 알림을 띄우지 않고도 작업 수행이 가능하게 하고 싶을 때, Windows가 부팅되자마자 사용자가 로그인 하기도 전에 자동으로 실행시키고 싶을 때 사용한다. 일단 전체적인 큰 틀부터 잡아본다면 구조는 아래와 같다. 서비스 실행 > 서비스.exe > 서비스.exe에서 원하는 프로그램 실행 > 내가 원하는 프로그램 그럼 이제 서비스를 생성해보자. 생성을 해야 실행을 할테니 ㅎㅎㅎ Create 과정 BOOL CService::CreateServiceProc(WCHAR *ServiceName, WCHAR *DisplayName, WCHAR *ExePath) { CString E..
-
Volatile 변수란?Windows 프로그래밍 2019. 1. 7. 16:35
이름부터 신기한 볼라틸 변수에 대해 알아보자. 결론부터 말하자면 볼라틸로 선언한 변수는 사용할 때 마다 메모리에 접근해 해당 변수의 값을 확인한다. 그럼 이제 이걸 왜 쓰는지 이유를 알아보도록 하자. 아래와 같은 코드가 있다. 쓰레드를 실행하는 함수 하나와 check값이 FALSE 이면 계에에에속 도는 while문이 Main에 있다. Main에서 실행한 쓰레드에서는 check 값을 TRUE로 바꿔준다. BOOL check = FALSE; int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE, LPSTR lpCmdLine, int nCmdShow){ DWORD dwThreadId; CreateThread(NULL, 0, ThreadFunc, NULL, 0, &dwThr..
-
Service 프로세스에서 winlogon.exeWindows 프로그래밍 2019. 1. 3. 17:39
Windows Service 프로그램을 개발하던 중 Winlogon.exe 프로세스의 세션 ID를 가져오는 것을 보았다.왜 하필이면 이 프로세스의 세션 ID를 가져오고, 이 프로세스가 무슨 일을 하는건지 궁금해서 찾아보게 되었다. 일반적으로 Service 프로그램들은 GUI를 다룰 수 없다. Windows가 보안성을 위해 시스템 프로세스와 사용자 영역을 분리해 두었는데, Service는 시스템 프로세스에 속하기 때문이다. 작업 관리자를 보면 사용자 이름이 컴퓨터 이름인 프로세스들의 세션 ID는 1로 표시되어 있고 SYSTEM이나 다른 몇몇 사용자 이름을 가진 프로세스들은 0번으로 표시되어 있다.즉, Service 프로세스라도 세션 번호가 1이라면 사용자 영역에 접근해 창을 띄울 수 있다는 뜻이다. 이제 ..