본문 바로가기

프로그래밍12

COM 인터페이스 포인터를 서로 다른 Apartment로 전달하기 멀티쓰레드 환경에서 COM을 사용할 때 서로 다른 쓰레드 간에 인터페이스 포인터를 넘겨서 사용하는 경우가 있을 수 있습니다. 이 때 Apartment Threaded인 경우 문제가 생깁니다. 서로 다른 Apartment로 인터페이스 포인터를 넘겨야 하는데 문제가 발생하는 경우가 있습니다. 이런 경우 Global Interface Table(GIT)을 사용하면 됩니다. 다음은 MS 기술자료(http://support.microsoft.com/kb/601770/ko)에 나와 있는 GIT 사용 단계입니다. 1. GIT 인스턴스를 생성합니다. IGlobalInterfaceTable *pGIT = NULL; ::CoCreateInstance (CLSID_StdGlobalInterfaceTable, NULL, CL.. 2007. 6. 27.
Windows NT 계열에서 프로세스 강제 종료하기 Windows에서 프로세스를 강제 종료하려면 TerminateProcess() API를 사용하면 된다. 그런데 Windows NT 계열에서 TerminateProcess()를 사용하려면 PROCESS_TERMINATE 접근 권한을 가지는 프로세스 핸들이 필요하다. OpenProcess()로 PROCESS_TERMINATE 접근 권한의 프로세스 핸들을 얻을 수 있는데 High integrity level 이상의 프로세스는 그 전에 먼저 SeDebugPrivilege 권한을 획득해야 한다. 따라서 프로세스를 종료하기 위한 절차는 다음과 같다. 1. 현재 프로세스의 권한을 변경하기 위한 액세스 토큰의 핸들을 가져온다. OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_.. 2007. 6. 1.
투명 이미지 그리기(MaskBlt, TransparentBlt) 부분적으로 투명한 이미지는 상당히 쓸모가 많다. 특히 스킨 형태의 어플리케이션을 개발하려면 투명 이미지를 그리는 것은 꼭 필요한 요소 중 하나다. WIN32에서도 MaskBlt(), TransparentBlt() 등의 투명한 이미지를 그리기 위한 API를 제공하지만 MaskBlt()는 Windows NT 계열에서만 사용할 수 있고 TransparentBlt()는 Windows 98이나 2000이상에서만 사용이 가능하다. 만약 Windows 9X나 Windows 2000 미만에서 투명한 이미지를 그리려면 다음과 같은 방법으로도 가능하다. 최근에는 Windows 9X 사용자가 줄어서 거의 필요 없지만 말이다. 1. 먼저 배경색을 이용해서 마스크 비트맵을 만든다. 이미 마스크 비트맵이 있다면 생략이 가능하다... 2007. 4. 3.
메모리 DC를 이용한 더블 버퍼링 화면에 이미지나 도형, 텍스트 등 여러가지를 출력하다 보면 깜박거리는 현상을 보게 된다. 한 번 출력하고 말 것이라면 크게 문제가 안 될 수 있지만 지속적으로 출력하는 상황에서는 깜박거림은 피하고 싶은 문제 중 하나이고 가장 쉽고 일반적인 해결책은 더블 버퍼링이다. 다음은 메모리 DC를 이용한 더블 버퍼링 방법이다. 1. 출력하려는 크기의 비트맵과 메모리 DC를 생성하고 메모리 DC에 생성된 비트맵을 선택한다. HBITMAP hbmMem = CreateCompatibleBitmap(hdc, 48, 48); HDC hdcMem = CreateCompatibleDC(hdc); HBITMAP hbmOld = (HBITMAP)SelectObject(hdcMem, hbmMem); 2. 생성한 메모리 DC(hdcM.. 2007. 3. 31.
MFC의 CPropertySheet, CPropertyPage에서 디자인 깨지는 문제 MFC의 CPropertySheet와 CPropertyPage는 탭 컨트롤 기반의 환경설정이나 위자드 다이얼로그를 만들 때 많이 사용하는 클래스들이다. 그런데 리소스 에디터에서 디자인한 다이얼로그를 CPropertyPage로 만들어서 사용하다 보면 디자인이 변경되어서 깨지는 문제가 발생하곤 한다. 특히 한글 윈도우에서 디자인한 다이얼로그를 영문 윈도우(물론 랭귀지팩이 깔린)에서 보면 거의 깨져 보인다. 원인은 CPropertySheet에서 다이얼로그 템플릿을 초기화할 때 CPropertyPage의 폰트를 CPropertySheet의 폰트와 같은 폰트로 변경하면서 디자인이 바뀌기 때문이다. 이것을 막으려면 CPropertySheet를 상속 받아서 BuildPropPageArray()를 오버라이딩한 다음 폰.. 2007. 2. 28.
Windos Vista에서 IE7 실행 및 IWebBrowser2 인터페이스 얻기 Windows Vista에서 IWebBrowser2를 CoCreateInstance로 생성하는 경우 몇가지 제약 사항들이 있다. 먼저 Internet Explorer을 Visible하게 하기 전에 먼저 Navigate를 실행해야 한다. 다음으로 Navigate하고자 하는 URL이 Trusted Domain이 아니면 실행하는 어플리케이션이 관리자 권한으로 실행 중이거나 보호 모드가 설정된 IE7을 실행해야 한다. 그렇지 않으면 IE7은 보호 모드가 설정된 IE 프로세스를 다시 생성하고 기존 프로세스는 종료된다. 문제는 CoCreateInstance로는 보호 모드가 설정된 IE 프로세스를 생성할 수가 없다는 점이다. 이를 해결하기 위해서는 보호 모드가 설정된 IE7에 대한 IWebBrowser2 인터페이스를.. 2007. 2. 23.