특정 시점부터 ::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 : 잘못된 내용 수정 및 예제 코드 추가.
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 : 잘못된 내용 수정 및 예제 코드 추가.
Boland C++ 5.0 사용자 입니다.
답글삭제해당 DLL의 일부 코드를 ::Release() 호출하여 해결하셨나요?
아 Release가 아니고 ReleaseDC 입니다.
답글삭제예를 들어 설명 드리면..
[원래 코드(잘못된 코드)]
GetDeviceCaps(::GetDC(NULL), LOGPIXELSY);
[수정된 코드]
CDC* pDC = ::GetDC(NULL);
GetDeviceCaps(pdc, LOGPIXELSY);
::ReleaseDC(NULL, pdc);
pdc = NULL;