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

C++빌더 Q&A
C++Builder Programming Q&A
[1903] Re:[질문] 리소스 dll을 만들려면은...
박지훈.임프 [cbuilder] 4336 읽음    1999-09-04 00:00
: 안녕하세요?
: wave,midi,bitmap 파일을 실행파일에 추가 하려 합니다.
: 책이나 관련강좌를 보면은 RC파일을 이용해서 실행파일에
: 추가 한다고 나와있습니다.
: 근데 저는 실행파일에 집어넣으면은 너무 실행파일이 커진다는
: 점때문에 영 마음에 들지 안습니다.
: 그래서 DLL파일에 집어넣을려고 합니다.
: 어디선가 ResourceDll이라는 말도 들어봤구요 ^^;
: 근데 막상 해볼려니 갈피를 못잡겠습니다.
: 어떡해야 ResourceDll을 만들어서, 자원을 제 프로그램에서
: 읽어들이는 지 가르쳐 주세요.
: 그럼 안녕히 계세요.
:
:                                             박세율올림
:
: PS {
:     MIDI로 된 자원을 읽어서 연주하는 법도
:     가르쳐 주세요
:    
: }


임펠리테리입니다.

리소스 dll을 만드는 것은, 코딩과는 전혀 관계가 없는, 정말 단순한 일입니다.
오히려.. 거기서 리소스를 읽어오는 것이 조금 까다롭죠. ^^

빌더의 이미지에디터를 이용하면 res파일을 만들어서 비트맵이나 아이콘을
그 res 파일에 포함시킬 수 있고, 말씀하신대로, rc 파일을 직접 작성하면
그 외에 별의 별(?) 것을 다 집어넣을 수 있습니다.

리소스 스크립트 파일(.RC)은, 그 자체가 스크립트인만큼 하나의 언어로서
형식이 엄청나게 복잡합니다. 그렇지만, 단순히 특정 리소스를 집어넣는
절차는 아주 간단하죠.
한 라인 단위로,
리소스의이름(혹은 숫자ID) (리소스형식) (파일이름)
이면 됩니다.

그러니까, 만약 비트맵을 집어넣으려고 한다면,
MyResBitmap BITMAP "bitmap.bmp"
이런 식이면 됩니다. 여기서 지정해준 이름 MyResBitmap은, 이 리소스를 불러오는
코드에서 사용하게 될 리소스이름입니다. (혹은 숫자로 ID를 지정해줘도 됩니다.)

여기서.. 한가지 주의해야 할 것은, 리소스가 표준으로 지원하는 형식은
몇가지로 제한되어 있다는 것입니다. 리소스에 넣을 수 있는 표준 형식은
비트맵, 폰트, 문자열, 커서, 아이콘 정도입니다. (그 외에도 몇가지 더
있습니다만 여기서 논할 필요는 없는 것들입니다.)
그 외의 모든 데이터는 RCDATA로 지정해야 합니다. 예를 들면, 대표적으로
빌더의 폼인 dfm조차도 MS에서 만든 표준인 RC 문법에서는 비표준이므로
RCDATA로 지정되어 있습니다. 그러므로.. wave나 avi등은 모두 형식을
RCDATA로 지정해야 합니다.
MyWave RCDATA "wave.wav"

이렇게 해서 RC 파일을 만든 후에, 리소스 컴파일러(brc32.exe)로 직접
컴파일해서 프로젝트에 포함시켜도 되지만, 사실 그럴 필요는 없고, 빌더의
프로젝트가 RC를 지원하므로, 프로젝트 매니저에서 RC 파일을 그대로 Add하면 됩니다.

물론 리소스만 집어넣을 dll이므로 빌더가 만들어준 기본 코드를 수정할 필요가
전혀 없습니다. 단지 프로젝트에 RC 파일만 추가하면 되죠.
그럼 이 dll 프로젝트를 컴파일하면, 원하던 리소스 dll이 생깁니다.

자.. 그럼 이제, 이걸 어떻게 불러들이느냐로 들어갑니다.
당연히 api 함수에는 LoadBitmap, LoadResource, LoadString 등등
리소스로부터 데이터를 읽어들이는 함수들이 준비되어 있습니다.
뭐, 이걸 직접 사용해도 상관은 없습니다만.. 빌더 프로그래머답게,
빌더틱(?)하게 해결하도록 합시다.

리소스를 불러들이는 빌더틱한 방법은 TResourceStream 클래스를 사용하는
것입니다. 이 클래스를 사용하면 당근 빌더의 장점중 하나인 스트리밍을 지원하므로
여러가지로 vcl내에서 호환성이 좋아질 수 있습니다.

어쨌든.. 이 TResourceStream을 사용하는 간단한 예를 봅시다.
    TResourceStream *ResStream = new TResourceStream(DllInstance, "MyWave", RT_RCDATA);
이렇게 하면 ResStream라는 스트림 객체를 통해 아까 추가한 웨이브 데이터를
억세스할 수 있게 됩니다. 일반적인 스트림 클래스의 특성과 마찬가지로,
Size 프로퍼티로 전체 데이터의 크기를 알아낼 수 있고, Read나 Write 메소드,
그리고 TCustomMemoryStream에서 상속받은 SaveToFile이나 SaveToStream
메소드 등을 사용할 수 있습니다.

그럼 참고하시길...

+ -

관련 글 리스트
1902 [질문] 리소스 dll을 만들려면은... 박세율 3246 1999/09/04
1903     Re:[질문] 리소스 dll을 만들려면은... 박지훈.임프 4336 1999/09/04
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.