본문 바로가기
IT-개발,DB

[델파이] [강좌] 리소스의 활용 I

by SB리치퍼슨 2016. 4. 15.

[강좌] 리소스의 활용 I  


아래에 Resource DLL의 활용 방법에 대한 강좌 요청이 있어서 저의 졸고라도
도움이 되실까 해서 올려 드립니다. 참고가 되시길...

리소스의 활용 I

글: 하영재(vaio91@yahoo.com)
    델파이 코리아(www.delphikorea.com)


들어가며...

델파이 코리아(www.delphikorea.com)나 다른 통신사에서 심심치 않게 올라오는
질문중에 Resource File(이하 리소스 파일이라 한다...^^)의 사용에 대한 질문이
있다. 
리소스 파일을 만들고 사용하는 문제들에 대한 질문들인데, 여러가지 단편적인
내용만을 가지고 조합을 해야 하니 처음 접하는 분들은 어려움을 느낄 수도 있을
것이다. 이런 분들을 위해 리소스 파일에 대한 모든 부분이라고는 할 수 없겠으나
많이 사용되는 부분에 대해서 예제와 더불어 간단하게 나마 천천히 살펴보려 한다. 


지금 부터 살펴볼 내용은 다음과 같다.

- 리소스 파일을 만드는 방법.
- 리소스 DLL을 만드는 방법.
- 위의 리소스 파일을 만드는 방법의 상세 내용
   . Bitmap 리소스 파일을 만들고 사용하기
   . Text 리소스 파일을 만들고 사용하기
   . AVI 리소스 파일을 만들고 사용하기
- 리소스 사용시 주의해야 할 메모리 문제
- 그 외 리소스로 할 수 있는 일들

이상과 같은 내용을 살펴 볼 것인데 아주 기초적인 부분부터 다룰 것이므로 기존에
다뤄본 분들이라면 아낌없이 다른 강좌들에 눈을 돌리자... ^^

이곳에서 사용할 예제는 본인이 직접 작성한 것도 있으나 아주 잘만들어진 예제를
제공하기 위해 Borland TI의 소스도 참고했음을 밝혀둔다. TI의 예제 소스를 사용한
부분에서 미리 발췌 했음을 알리도록 할 것이다.


리소스 파일 만들기...

리소스 파일은 바이너리 형태의 데이터로서 RCDATA라 부른다. 리소스 파일은
Res라는 확장자를 가지게 되는데 이 Res 파일을 만들기 위한 과정을 살펴 보자...

Res 파일을 만들기 위해서는 Text로 작성된 RC 파일이 있어야 한다. 이 RC 파일은
Res 파일에 포함하고자 하는 데이터 이름과 데이터 식별자, 그리고 데이터로 구성된
Text 파일이다. RC 파일의 예를 보자...

- RC 파일의 예

  WAVEFILE WAVE c:\WaveSound.wav

이렇게 작성된 것이 RC 파일이다. 여기서 'WAVEFILE'은 리소스를 호출할 때 쓰일
이름이며 'WAVE'는 이 리소스가 WAVE 파일임을 명시하는 것이며 맨 뒷부분은 실제로
리소스에 적재될 파일의 경로와 파일명으로 구성되어 진다. 
이렇게 텍스트 에디터에서 작성을 한 후 '파일이름.RC'로 저장을 하면 된다. 

여기까지 해서 RC 파일을 작성했으면 이제는 컴파일을 해서 RES 파일로 만드는
과정이 남아 있다. 
리소스 파일을 만들기 위해 델파이에서는 BRCC(Boaland Resource Command Line
Compiler)와 BRCC32를 제공한다. 이 녀석들은 RC 파일을 컴파일해서 RES 파일로
만들어 주는 역할을 한다. 
이름 그대로 Command Line에서 사용하는 녀석들인데 사용방법은 매우 간단하다. 
그저 'BRCC32 파일명.RC' 라고 커맨드 라인에서 입력하기만 하면 RES 파일을 만들어
준다. 이 두녀석은 델파이의 BIN 디렉토리에 존재하며 다른 경로에서 컴파일 하기
위해서는 Path에 이 디렉토리를 추가하여 주어야 한다.
(예: path c:\progra~1\borland\delphi5\bin) 

- RC 파일의 컴파일

   BRCC32 MyRes.RC

이렇게 해서 만들어진 Res 파일을 사용하려면 어떻게 해야 하는지 알아보자. 
리소스 파일을 실행파일의 Res에 추가하려면 $R 지시자를 사용하여 추가한다. 
이렇게...

{$R MyRes.RES}

아마 Unit에서 {$R *.DFM} 이렇게 작성된 부분을 보았을 것이다. 이것 또한 DFM
파일을 폼의 리소스에 추가하겠다는 코드이다. 이렇게 추가된 리소스는 한 프로젝트
내의 모든 유닛에서 사용이 가능하다. 

위와 같이 하여 폼에 우리가 작성한 Res 파일을 추가한 후 컴파일을 하면 컴파일
전과 컴파일 후의 실행 파일의 크기가 변한 것을 알 수 있다. 당연한 이야기지만...
실행 파일에 우리가 작성한 리소스 파일을 추가 했으니 추가된 리소스 만큼 폼의
크기가 늘어나는 것은 당연한 것이다. 

마지막 부분에서 생각해 볼 것이지만 리소스 파일을 남발하는 것은 자칫 잘못하면
엄청난 크기의 실행 파일을 만들어 낼 수도 있다는 것을 주의해야 하며 이것은
메모리 낭비로 이어지는 것이다.

이렇게해서 실행 파일에 우리의 리소스를 추가했다면 우리는 이 리소스를 사용을
해야 한다. 어떻게 추가된 리소스를 사용하는지 알아보자. 



리소스의 사용예

우리가 추가한 리소스가 Wave 파일이므로 리소스에서 Wave 파일을 로드하여
연주하는 방법을 살펴보자.
Wave 파일을 연주하려면 PlaySound나 sndPlaySound 같은 API를 이용하여 연주하게
되는데 문제는 Wave가 파일로 존재하지 않는 것이라는 것이다. 리소스에 추가된
Wave를 연주하는데 PlaySoud와 sndPlaySound는 서로 비슷한 방법을 사용해서
연주하게 된다. 본론 부터 말하자면 두 함수 모두 Wave 리소스를 연주하는데는
별다른 차이가 없다. 즉 사용방법이 거의 동일하다는 얘기이다. 이 함수들을
사용하기 전에 MMSYSTEM을 Uses에 추가 해 주어야 한다.

- PlaySound의 경우...

  PlaySound의 경우는 바로 리소스에서 Wave를 연주 할 수 있는데 바로 SND_RESOU   
RCE란 플랙을 이용하면 된다. 
  예를 보자...

  PlaySound('WAVEFILE', hInstance, SND_RESOURCE or SND_ASYNC);

  여기서 WAVEFILE은 처음에 RC 파일을 만들때 맨 앞에 적어 주었던 리소스 이름    
이며 두번째 인자로 필요한 HModule에 현재 Instance를 주면 되며 마지막으로 
  SND_RESOURCE라는 플랙을 추가 함으로써 간단히 Wave리소스를 연주 할 수 있다.

- sndPlaySound의 경우...

  sndPlaySound도 PlaySound와 별다른 차이가 없다. 

  sndPlaySound('WAVEFILE', SND_RESOURCE or SND_ASYNC);

  설명을 따로 할 필요가 없을 정도로 비슷하다. 

리소스에서 바로 연주하는 방법을 살펴 보았는데 다른 방법으론 TResourceStream을
이용해서 연주하는 방법이 있다. 이 때 사용하는 플랙은 SND_MEMORY란 플랙이며
sndPlaySound만을 예로 들어 보겠다. 

- TResourceStream을 이용한 연주...

   var
     Soo: TResourceStream;
   begin
     Soo := TResourceStream.Create(hInstance, 'WAVEFILE', PChar('Wave'));
     sndPlaySound(Soo.Memory, SND_MEMORY or SND_ASYNC);
     Soo.Free;
   end;

   TResourceStream을 생성하는 부분을 살펴 보면... 첫번째 인자로 인스탄스를 
   넘겨준다. 그리고 두 번째로 리소스 이름, 그리고 마지막으로 리소스 타입을
   넘겨주면 된다. 
   이렇게 해서 얻어진 Wave를 sndPlaySound의 SND_MEMORY 플랙을 이용해서 연
   주 할 수 있는 것이다. 
   PlaySound도 거의 동일 하므로 직접 한 번 해 보기를 권한다.


여기까지 해서 어떻게 리소스 파일을 생성하는지를 알아보았고 또 어떻게 리소스에
추가된 데이터를 읽어 오는가에 대해 알아 보았다. 
다음번에는 리소스 DLL을 만드는 방법과 만들어진 리소스 DLL을 이용해서 동적으로
리소스를 불러오는 방법... 그리고 각 리소스를 어떻게 사용하는지에 대해 알아
보도록 하겠다. 

노파심에 한 마디 더 하자면... 설명한 부분중 설명이 잘 못된 부분이 있을경우
지적해 주시면 바로 수정 조치 토록 하겠다. 

끝까지 읽어 주신 분들께 경의를 표하며 이만 마치겠다. 



RESEXAM1.ZIP


반응형

댓글