C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 팁&트릭
C++Builder Programming Tip&Tricks
[325] Windows 98에서의 GetDC 사용
유영인 [Chris] [cuperido] 7398 읽음    2002-04-08 17:48
안녕하세요..

Windows 98은 메모리를 잘 환원해 주지 못하는 OS로 유명하죠. 그렇기 때문에 모든 어플리케이션을 만들때, 이런저런 부분에서 신경을 써 주어야 합니다. CodeGuard로 봐도 누수가 안나오지만, 시스템 리소스는 계속 떨어지고 결국에는 시스템이 다운되고 말죠.

일반적으로 간단한 그래픽 작업을 하는 게임이나 어플리케이션에서 GetDC를 사용하는 경우가 종종 있죠. GetDC는 MSDN에서도 ReleaseDC를 안해주면 리소스를 계속 잡아먹는다고 경고하고 있는데, 문제는 Windows 98에서는 ReleaseDC를 해주어도 반환이 안된다는데에 있습니다.

GetDC를 사용하는 일반적인 문법 순서는 다음과 같습니다.

  hdDC = GetDC(hdHandle);
  BitBlt(...................................., );
  ReleaseDC(hdHandle, hdDC);

보통 저런 순서로만 해준다면, NT 계열에서는 문제없이 잘 돌아갑니다. 하지만 98에서 시스템 리소스를 보면 계속 떨어집니다. 위 소스는 CodeGuard에서 문제가 없는 소스죠.

따라서, 무식하지만 아래와 같이 처리해 주는 방법밖에는 없습니다. 일단, GetDC에서 읽어올때, 전체화면에서 읽어와 부분적으로 처리할 수 있도록 hdHandle 은 무시하고 무조건 0으로 받습니다.

1. 전역변수에 HD_DC 라는 것을 선언.
2. 프로그램이 시작할때, HD_DC = GetDC(0); 을 추가
3. 프로그램이 종료할 때, ReleaseDC(0, HD_DC); 를 추가
4. 캡쳐나 다른 작업을 원할때는 hdHandle 을 가지고 있으면 다음과 같이 따로 작업을 합니다.

RECT              rtPosition;


GetWindowRect(hdHandle, &rtPosition);

BitBlt([비트맵]->Canvas->Handle, 0, 0,
        rpPosition.Right - rpPosition.Left, rpPosition.Bottom - rpPosition.Top
        HD_DC, rpPosition.Left, rpPosition.Top, SRCCOPY);

위와 같이 GetDC를 한번만 사용하는 방식으로 바꾸신다면, 물론 단 한번의 메모리 반환은 이루어지지 않겠지만, 계속하여 누수가 생기는 일은 발생하지 않습니다. 좋은 방법이진 않지만, Windows 98 계열에서 메모리 문제가 발생하셨던 분이시라면 임시적으로 사용할 방법은 되지 않을까 싶네요.

한게임 포커가 이런 방식으로 메모리 누수를 일으키죠. --;

+ -

관련 글 리스트
325 Windows 98에서의 GetDC 사용 유영인 [Chris] 7398 2002/04/08
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.