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
[83] 리소스로부터 wav를 불러와서 플레이하기
박지훈.임프 [cbuilder] 9998 읽음    2001-03-24 14:28
임펠리테리입니다.

실행파일이나 dll에서 리소스로 어떤 데이터를 저장한 후 불러오는 방법은 크게 Win32 API를 이용하는 방법과 VCL의 TResourceStream을 사용하는 방법 두가지가 있습니다. 오늘은 이 두가지 방법을 이용하여 리소스로 저장된 wav 데이터를 불러와 연주하는 방법을 알아보죠.

들어가기 전에, 먼저 실행파일에 wav 데이터를 리소스로 추가해야 겠지요? 먼저 Birthday.rc라는 이름의 빈 텍스트 파일을 하나 만들고, 내용을 다음과 같이 적습니다.
BIRTHDAY RCDATA "Birthday.wav"
이 한라인만으로 충분합니다. (Birthday.wav는 포함시키려는 wav 파일이름으로 바꾸어야 겠지요)
그런 후, 프로젝트 매니저를 열고 빌더 메뉴에서 Project -> Add to Project를 선택해서 파일오픈 다이얼로그가 나오면, 아래쪽 파일형식을 rc 타입으로 선택한 후 방금 만든 Birthday.rc 리소스 파일을 선택하면 됩니다. 이제, 프로젝트는 Birthday.wav파일을 함께 링크할 준비가 되었으므로 컴파일하면 리소스에 wav 파일이 포함되게 됩니다.

이제, 이렇게 추가한 wav 리소스를 불러오는 방법을 알아봅시다. Win32 API를 이용하는 방법 먼저 알아보죠. 아이콘이나 비트맵, 메뉴 등등 흔히 사용되는 리소스 타입들은 LoadIcon(), LoadBitmap(), LoadMenu() 등 각각 불러오는 함수가 따로 존재합니다. 하지만 wav의 경우에는 해당 함수가 없으므로 일반 함수인 LoadResource()를 사용합니다.

이 LoadResource() 함수는 두개의 인자를 갖는데, 첫번째 인자는 실행파일의 모듈 핸들인데, 여기서는 자신이므로 특별히 지정할 필요가 없이 NULL을 넘겨주면 됩니다. 두번째 인자는 리소스 핸들로서, 특정 이름의 리소스로부터 리소스 핸들을 얻어오는 함수 FindResource()를 이용하면 됩니다. 이 FindResource() 함수는 역시 NULL을 첫번째 인자로 갖고, 두번째 인자는 리소스 이름, 세번째 인자는 리소스 타입입니다. wav는 표준이 아니므로 RT_RCDATA를 넘겨주면 됩니다.

그런데 LoadResource() 함수는 글로벌 메모리 블럭의 핸들을 돌려주므로 이것을 다시 메모리 주소로 바꾸기 위해 LockResource()함수를 호출해야 합니다. 결과적으로, 다음과 같이 하면 되죠.

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    const char *WavInMemory = (LPCSTR)LockResource(LoadResource(NULL, FindResource(NULL, "BIRTHDAY", RT_RCDATA)));
    PlaySound(WavInMemory, NULL, SND_MEMORY);
}


다 되었군요. 이제 버튼을 누르면 음악소리를 들을 수 있습니다.

이번에는 VCL의 TResourceStream을 이용하는 방법을 알아봅시다. TResourceStream를 이용하면 귀찮은 처리를 줄여주므로 앞에서보다 더 간단하게 할 수 있습니다. TResourceStream의 생성자는 직접 인스턴스 핸들과 리소스 이름, 리소스 타입을 인자로 받으므로, 적절한 인자를 넘겨주고 TResourceStream을 생성하기만 하면 바로 해당 리소스를 읽어올 수 있습니다.

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    TResourceStream *Res = new TResourceStream((int)HInstance, "BIRTHDAY", RT_RCDATA);
    PlaySound((char *)Res->Memory, NULL, SND_MEMORY);
    delete Res;
}


앞에서 API를 이용했을 때보다 라인수는 하나 더 많습니다만, 구조는 더 간단하죠.

그럼 이만...

+ -

관련 글 리스트
83 리소스로부터 wav를 불러와서 플레이하기 박지훈.임프 9998 2001/03/24
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.