기본 콘텐츠로 건너뛰기

윈도우에서 오라클19c 설치 중 ins-35180 오류 발생 시 조치 방법

특정 시점부터 ::GetDC(NULL)가 NULL을 반환하는 문제의 원인.

윈도 OS에서 프로그램 실행 중 어느 시점부터 갑자기 이미지 처리 함수가 제대로 동작하지 않는 문제가 발견되었습니다.
DC를 이용해서 특정 텍스트를 출력하는 함수인데 프로그램 실행 초기에는 잘되다가 어느 정도 시간이 지나면 안되더군요..

로그를 찍어서 분석해보니 해당 함수 내에 ::GetDC(NULL)를 이용해서 DC를 가져오는 부분이 있는데, 이상하게도 일정 시간이 지나면 항상 ::GetDC(NULL)가 NULL을 반환했습니다.

즉, 텍스트가 출력되지 않는 것은 DC를 가져오지 못했기 때문이었습니다.

그렇다면 왜 ::GetDC(NULL)이 NULL을 반환했을까요?
여러 원인이 있을 수 있겠지만 제 경우에는 DC 객체 자원 누수 때문이었습니다.

해당 프로그램에서 사용하는 DLL 중 하나에서 ::GetDC()를 한 후 ::ReleaseDC()를 하지 않는 버그가 있었고, 이 때문에 서서히 DC 객체 자원이 누수되어 이런 문제가 발생한 것이었습니다.

예시...

[원래 코드(잘못된 코드)]
int nTmp = GetDeviceCaps(::GetDC(NULL), LOGPIXELSY);

[수정된 코드]
CDC* pDC = ::GetDC(NULL);
int nTmp = GetDeviceCaps(pdc, LOGPIXELSY);
::ReleaseDC(NULL, pdc);
pdc = NULL;



- 2017. 7. 28 : 잘못된 내용 수정 및 예제 코드 추가.

댓글

  1. Boland C++ 5.0 사용자 입니다.
    해당 DLL의 일부 코드를 ::Release() 호출하여 해결하셨나요?

    답글삭제
  2. 아 Release가 아니고 ReleaseDC 입니다.
    예를 들어 설명 드리면..

    [원래 코드(잘못된 코드)]
    GetDeviceCaps(::GetDC(NULL), LOGPIXELSY);


    [수정된 코드]
    CDC* pDC = ::GetDC(NULL);
    GetDeviceCaps(pdc, LOGPIXELSY);
    ::ReleaseDC(NULL, pdc);
    pdc = NULL;

    답글삭제

댓글 쓰기

이 블로그의 인기 게시물

프로세스 강제 종료 불가 시.

특정 프로세스를 강제 종료 하려는데... "실행 중인 작업 인스턴스가 없습니다." 이런 메시지가 나타나면서 종료가 안되는 문제가 있었습니다. 작업 관리자에서 "프로세스 종료", "프로세스 트리 종료" 해봐도 안되고, cmd에서 taskkill 해봐도 안되고... 그런데 이게 부모 프로세스를 종료하면 자동으로 종료가 되네요.. (제 경우에는 Visual Studio가 부모 프로세스였습니다. ㅋ) 참고: DEVPIA http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=50&MAEULNo=20&no=917792&ref=917791