반응형

윈도우 프로그래밍 18

MFC WebView2(IE Edge, 엣지) 컨트롤

윈도우에서 웹을 보여주는 기존 인터넷익스플로어(IE)기반 컨트롤은 상대적으로 느리고 HTML5등 최신 웹에 대한 호환성도 좋지 않습니다. 그래서 MS가 인터넷익스플로어에서 엣지(Edge)로 웹브라우저를 변경했듯이 WebView2라는 엣지 기반의 웹을 보여주는 컨트롤을 외부 라이브러리로 제공하여 줍니다. 만들고 있는 C++ MFC 기반의 클라이언트에서 특정 정보들을 웹으로 보여주는 관계로 WebView2 컨트롤을 위 스크린 샷처럼 사용하여 보았습니다. 실제 코딩은 Code Project의 WebView2 Edge Browser in MFC C++ Application를 참조하여 만들었습니다. 적용하는데 반나절 정도 걸렸는데 적용하기가 IE기반 컨트롤에 비하여 조금은 까다롭습니다. 해당 소스를 보면 컨트롤을..

MFC 다이얼로그에서 컨트롤 관련 깜박임 문제 해결

컨트롤에서 자식 컨트롤 관련하여 MoveWindow등을 사용하여 위치나 크기를 변경하였을 때, 컨트롤에서 깜박임(flickering) 현상이 발생합니다. 이때 페인트되는 영역에서 자식 컨트롤 부분을 제외하기 위하여 컨트롤 속성에 WS_CLIPCHILDREN 속성을 주면 깜박임 문제를 해결할 수 있습니다. 비슷한 예로 컨트롤에 더블버퍼링 등을 적용하여도 다이얼로그(dialog)에 있는 컨트롤(control)에 대해서 MoveWindow 등을 사용하여 위치나 크기를 변경하면 깜박임 (flickering) 현상이 발생합니다. 이럴 때는 다이얼로그에 WS_CLIPCHILDREN 속성을 아래 스크린샷처럼 설정하여 주면 깜박임 문제를 해결할 수 있습니다.

MFC 모든 차일드 윈도우 얻어오는 방법

wchar_t className[255]; CWnd* child = this->GetWindow(GW_CHILD); while (child) { ::GetClassName(child->GetSafeHwnd(), className, sizeof(className) / sizeof(wchar_t)); TRACE(L"%s\n", className); child = child->GetWindow(GW_HWNDNEXT); } MFC에서 현재 윈도우의 모든 자식 윈도우을 얻어와 자식 윈도우의 등록된 클래스 이름을 디버그로 표시하는 예제입니다. 해당 예제는 CWnd를 상속받은 클래스에서 동작하는 예제입니다. CWnd를 상속받지 않은 다른 곳에서 사용할 때는 약간의 응용이 필요합니다.

MFC 커스텀컨트롤에서 CWnd의 OnCreate 불리지 않는 문제 해결법

MFC의 커스텀컨트롤은 생성되기 전에는 서브클래싱이 일어나지 않습니다. 그런 관계로 커스텀컨트롤에 대입된 CWnd 상속 객체의 WM_CREATE메세지에 대한 대응 함수인 OnCreate가 호출되지 않습니다. 물론 서브클래싱이 일어난 이후에는 모든 메세지에 대한 CWnd 함수가 정상적으로 호출됩니다. 그런데 커스텀컨트롤에서 차일드 컨트롤을 만드는 일과 같이 OnCreate에서 하면 좋은 작업이 있습니다. 이럴 때는 CWnd의 PreSubclassWindow 함수를 재정의하고 여기에서 해주면 됩니다. 관련 참고는 아래와 같습니다. why oncreate() not called

CComVariant(tagVARIANT)을 wstring 혹은 CString으로 변환하기

CComVariant(tagVARIANT)는 모든 타입을 다 넣을 수 있는 union 구조체라서 해당 내용을 디버깅해 보기가 까다롭다. 여기서는 간단히 값을 볼 수 있게 wstring이나 CString으로 변환하게 해놓았다. CComVariant(tagVARIANT)는 vt라는 필드를 가지고 있다. 해당 필드는 객체가 어떤 타입의 값을 가지고 있는지 enum 타입으로 가지고 있다. 아래 코드는 해당 필드를 이용하여 CComVariant(tagVARIANT) 값을 wstring으로 변환하는 코드다. 윈도우에서 짜는 관계로 편의상 CString의 Format을 이용하였다. 고로 함수의 return 타입을 CString으로 변경하고 조금만 수정하면 CString으로도 변경된다. 참고로 아래 코드는 모든 타입을..

COM 객체에 대해서 비주얼스튜디오(Visual Studio)에서 인텔리센스 사용하기

대신증권 Cybos API의 COM객체를 사용하는데 Visual Studio에서 인텔리센스가 되지 않을때 해결하는 방법이다. Cybos API가 COM객체인 관계로 다른 COM객체에 대해서도 적용될 듯 하다. 우선 COM 자체가 윈도우용인 관계로 관련 라이브러리와 컴파일 및 링크를 위하여 MFC로 프로젝트를 생성하였다. (순수 C++로 하려고해도 관련 파일을 포함하고 컴파일 옵션 및 링크를 설정해야 하기 때문에 이쪽이 편하다.) 1. 우선 아래 예와 같이 COM 관련해서 import한다. #import "C:\DAISHIN\CYBOSPLUS\cpdib.dll" 2. 컴파일을 한다. 그럼 Debug빌드면 관련 Debug폴더에 Release빌드면 관련 Release폴더에 *.tlh 파일과 *.tli파일이 생..

윈도우 할당 메모리 개념(Private, Virtual, WorkingSet)

윈도우 할당 메모리는 아래와 같은 3가지 형태로 확인할 수 있습니다. 작업 세트(Working Set)작업 관리자에서 메모리로 보이는 항목으로 현재 프로그램이 사용하고 있는 물리 메모리의 양을 나타냅니다. 윈도우는 현재 불필요하거나 현재 여유가 없을 경우 프로그램 메모리를 디스크에 저장합니다. 소위 말하는 스왑(SWAP)이라고 표현되는 부분입니다. 즉 작업 세트는 해당 프로그램 중에 스왑되지 않고 현재 물리 메모리에서 차지하는 양입니다. 여기서 좀 더 깊이 들어간다면 보통 윈도우 프로그램은 실행 프로그램이 다른 공유 라이브러리를 참조하는 경우가 많고 그럴경우 작업 세트의 메모리는 참조하는 공유 라이브러리를 위하여 할당한 메모리도 포함하고 있을 수 있습니다.거기에 윈도우가 현재 메모리 상태와 프로그램 상태..

32bit 윈도우 어플리케이션 사용 가능 최대 메모리 (확장 옵션 설명 포함)

윈도우 32bit 어플리케이션의 최대 사용가능 메모리는 공식적으로는 2 기가입니다. 이건 보통 기초 윈도우 프로그래밍 책자에서 유저모드 메모리 2기가 + 커널모드 메모리 2기가로 잘 설명되어 있습니다. 하지만 32bit로 만들어졌구 아직 64bit로 포팅안된 서버 등을 유지보수 해야 한다면 때로는 더 많은 메모리가 있었으면 좋겠다는 생각이 들 수도 있을거 같습니다. 이럴때 32bit 윈도우에서는 부팅시 /3GB 옵션을 주거나 (윈도우 2003 서버, 2000, XP) 혹은 BCDEdit에서 IncreaseUserVA를 사용하면(윈도우 Vista, 7, 8, 10) 32bit 윈도우 어플케이션은 3G의 메모리를 사용할 수 있습니다. 만약 64bit 윈도우에서 실행시킨다면 컴파일시 /LARGEADDRESSA..

64bit 윈도우 프로그래밍

zdnet에 안철수연구소의 유병인님이 쓰신 3부작 글을 한눈에 볼 수 있게 요약하여 놓은 글입니다. [64비트 윈도우 프로그래밍] ① 32비트 프로그램을 엄호하라 64bit x86아키텍처는 32/64bit 겸용 아키텍처, IA64와 같은 64bit 전용 아키텍처로 나뉘며, 이 아키텍처에 따라서 64bit 윈도우의 동작은 틀려진다. 64bit 윈도우의 틀린점 (※이 틀린 점은 64bit 프로세스에서만 지원한다.) -64개의 CPU를 지원한다. -8K Page를 사용한다. x64와 IA64의 틀린점 -x64는 32bit 프로그램을 직접 실행하는데 비하여 IA64는 32bit 에뮬레이션을 하여 실행한다. -IA64는 AWE(Address Windowing Extention)를 사용할 수 없으며 일부 32bit..

Low Fragementation Heap(LFH)

Low Fragementation Heap이란 Heap Memory에 대하여 new와 delete등의 메모리 할당 및 소멸 작업시 멀티쓰레드에서의 Lock에 의한 overhead를 줄여주는 Heap을 말합니다. XP에서 처음 도입되었으며 Vista에서 본격적으로 홍보된 Windows Heap의 일종입니다. 1개의 CPU가 아닌 N개의 CPU에서 멀티쓰레드에서 16KB이하의 메모리를 할당을 위하여 사용할 때 괄목할 만한 성능 향상이 있으며 상황에 따라 기본 Heap에 비하여 성능이 떨어지기도 합니다. 주로 서버용 프로그램에 사용되어질 듯 합니다. 자세한 내용을 담은 페이지는 아래와 같습니다. 윈도우 비스타 힙 관리자 Vista에서의 LFH를 소개한 블로그 글입니다. 댓글에 자세한 테스트를 한 분의 글이 있..

Win32 ThreadPool

MSDN: Thread Pool API Thread Pool API에 대한 간략한 설명이 들어 있는 페이지 입니다. 이 페이지는 기본적으로 전 버전에서 지원하는 API들과 Window Vista에서 지원하는 새로운 Thread Pool API를 비교하며 설명하고 있습니다. 쓰레드 풀은 OS의 쓰레드 풀을 사용하는 것이고 Win2K부터 지원을 합니다. Thread Pool API라는 것은 OS Thread Pool에서 동작하는 API를 나열해 놓은 페이지 입니다. 그러니 API별 용도는 다릅니다. 이 글에서는 Original API를 바탕으로 하나씩 살펴볼까 합니다. 쓰레드 풀 쓰레드는 I/O 쓰레드와 non-I/O쓰레드 2가지 종류가 있습니다. I/O worker thread는 APC(Asynchrono..

OLE DB의 클래스 역활

CDataSource DBMS에 대한 연결 문자열, 즉 해당 DBMS에 대한 드라이브에 대한 연결을 제공하는 듯 보임 CSession 일종의 DB Connection임 CCommand Connection에 대하여 Query를 수행 한다. ..DBAccessor 자동으로 만들어지는 클래스로 컬럼에 대한 정보를 가지고 있다. CCommand객체로 Query시 이용한다. ..Accessor 자동으로 만들어지는 클래스로 컬럼에 대한 정보를 가지고 있다. .. : public CCommand 자동으로 만들어지는 클래스로 테이블형태의 억세스를 가능하게 해주는 클래스인 듯 보인다. CDBPropSet CCommand로 Query를 수행할 경우의 커서의 속성을 설정한다.

Fiber [beta]

파이버는 아래와 같은 단점을 가지고 있습니다.... 우선 처리가 적절하게 끝나야 합니다. 적절하게 끝나지 못하고 중간에서 Fiber Context Switching이 된 상태에서 끝나게 된 경우, 해당 Fiber Context에서 돌아가던 변수들이 클리어 되지 않습니다. 이것 때문에 애 먹었습니다. Compuware Error Detection으로 체크하는데 갑자기 Memory Leak과 Resource Leak이 나와 체크하였는데 결과적으로 실행하다가 프로그램 종료와 함께 종료된 Fiber Context에서 선언되고 사용되어진 Class들의 d'tor가 호출되지 않았습니다. 쩝... Thread관련 클래스에는 이상없이 클리어 되던 얘들인데... (상세한 조사는 하지 않고 버그만을 수정하였습니다.) --..

UDP, recvfrom()에서 WSAECONNRESET(10054) 에러 날 때...

recvfrom(...)에서 WSAECONNRESET(10054)에러가 나오면, 열라 황당하죠... 왜냐하면 10054의 의미는 ICMP Port Unreachable이라는 것인데, recvfrom은 내 소켓에서 데이터를 받는 것이니 왠? Unreachable? UDP에서 WSAECONNREST? WSAECONNRESET은 해당코드가 TCP에서의 에러일 떄의 의미를 이야기 하는 것이고 UDP소켓에서의 이유는 아래와 같이 MSDN에서 나와 있습니다. " On a UDP-datagram socket this error indicates a previous send operation resulted in an ICMP Port Unreachable message. " 뭐, 간단히 해석하자면 "먼저번 Send(..

반응형