본문 바로가기
Application/Delphi Lecture

리소스 파일 만들기와 사용법

by 현이빈이 2008. 8. 13.
반응형

리소스 파일 만들기...

리소스 파일은 바이너리 형태의 데이터로서 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을 이용해서 동적으로
리소스를 불러오는 방법... 그리고 각 리소스를 어떻게 사용하는지에 대해 알아
보도록 하겠다.

---------------------------------------------------


출처 델마당(http://www.delmadang.com/)

반응형