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

컴포넌트/라이브러리
Delphi/C++Builder Programming Components&Libraries
[137] ACM (음성채팅) 컴포넌트
홍용혁 [solaris1] 9881 읽음    2001-07-19 02:59
출처는 다음과 같습니다.
http://www.stuckindoors.com/delphi/acm/index.html

델파이로 만들어진 컴포넌트구여 먼저 압축푸십시오.

File->New->Package->Add 한후
다음의 다섯개의 파일들을 선택해주신후 install 시켜주시면 되겠습니다.

MSAcm.pas
ACMOut.pas
ACMIn.pas
ACMConvertor.pas
ACMConvertorReg.pas

그러면 똑같은 이름의 확장자만 .hpp 인파일들이 그 디렉토리에 생깁니다.
이놈들을 include\vcl 디렉토리로 복사해넣어주세요.

근데 문제점이 있습니다.(중요)
이컴포넌트를 가지고 컴파일하면 에러가 나더군요.
그래서 .hpp파일을 약간 수정을 해야합니다.
아무래도 델파이 컴포넌트가 빌더에서 완벽하게 호환이 안되는탓이라 생각됩니다.
저는 빌더4에서 해봤구요 에러가나서 다음과 같이 고쳤습니다.

[C++ Fatal Error] MSAcm.h(20): F1003 Error directive: MMREG.H version 142 or greater to be included first.
위의 에러이죠.
그런데 mmreg.h에서 버전을 바꿔보기도 해보고 msacm.h에서 조건부매크로를 주석처리해보기도 했지만
여전히 에러들이 없어지지 않았습니다.
그래서 이건 버전문제가 아니라 인클루드의 문제가 아닐까 생각했죠
그래서 msacm.hpp 파일을 열어서 #include "MMReg.h"를 #include "MSAcm.h" 라인위에 추가시켰습니다.
그랬더니 type name expected 에러가 뜨더군요.
그래서 첫번째 에러를 조사해봤습니다.
MSAcm.h 파일에는 다음과 같이 선언되어있더군요
typedef struct tACMDRIVERDETAILSA
{
     DWORD                cbStruct;                // number of valid bytes in structure

     FOURCC               fccType;                  // compressor type 'audc'
     FOURCC               fccComp;                  // sub-type (not used; reserved)

     WORD                  wMid;                      // manufacturer id
     WORD                  wPid;                      // product id

     DWORD                vdwACM;                   // version of the ACM *compiled* for
     DWORD                vdwDriver;               // version of the driver

     DWORD                fdwSupport;             // misc. support flags
     DWORD                cFormatTags;            // total unique format tags supported
     DWORD                cFilterTags;            // total unique filter tags supported

     HICON                hicon;                     // handle to custom icon

     char                  szShortName[ACMDRIVERDETAILS_SHORTNAME_CHARS];
     char                  szLongName[ACMDRIVERDETAILS_LONGNAME_CHARS];
     char                  szCopyright[ACMDRIVERDETAILS_COPYRIGHT_CHARS];
     char                  szLicensing[ACMDRIVERDETAILS_LICENSING_CHARS];
     char                  szFeatures[ACMDRIVERDETAILS_FEATURES_CHARS];

} ACMDRIVERDETAILSA, *PACMDRIVERDETAILSA, FAR *LPACMDRIVERDETAILSA;

그런데 MSAcm.hpp 파일에는 다음과 같이 선언되어있었죠.

typedef _ACMDRIVERDETAILSA *PAcmDriverDetailsA;

정확하게는 왜 에러가 나야하는지 모르겠지만 왠지 이부분을 주석처리해야 되지 않을까 생각되어서
에러난부분 모두를 주석처리했습니다.

혹시 이부분에 대해서 왜 이렇게 되는지 아시면 설명좀 부탁드립니다.

그리고 또한곳이 에러가나는데
ACMConvertor.hpp 였습니다.

_ACMFORMATCHOOSEA FChooseData;
이부분이 에러가 났죠.
마찬가지로 type name expected 에러였습니다.
그래서 MSAcm.h 를 찾아보았더니
typedef struct tACMFORMATCHOOSEA
{
     DWORD                cbStruct;                // sizeof(ACMFORMATCHOOSE)
     DWORD                fdwStyle;                // chooser style flags

     HWND                  hwndOwner;               // caller's window handle

     LPWAVEFORMATEX   pwfx;                      // ptr to wfx buf to receive choice
     DWORD                cbwfx;                     // size of mem buf for pwfx
     LPCSTR               pszTitle;                // dialog box title bar

     char                  szFormatTag[ACMFORMATTAGDETAILS_FORMATTAG_CHARS];
     char                  szFormat[ACMFORMATDETAILS_FORMAT_CHARS];

     LPSTR                pszName;                  // custom name selection
     DWORD                cchName;                  // size in chars of mem buf for pszName

     DWORD                fdwEnum;                  // format enumeration restrictions
     LPWAVEFORMATEX   pwfxEnum;                // format describing restrictions

     HINSTANCE          hInstance;               // app instance containing dlg template
     LPCSTR               pszTemplateName;      // custom template name
     LPARAM               lCustData;               // data passed to hook fn.
     ACMFORMATCHOOSEHOOKPROCA pfnHook;    // ptr to hook function

} ACMFORMATCHOOSEA, *PACMFORMATCHOOSEA, FAR *LPACMFORMATCHOOSEA;

이렇게 되어있더군요 .. 그리고 앞에 언더바가 붙은 이름은 없었습니다.
그래서 언더바를 빼버렸죠.

ACMFORMATCHOOSEA FChooseData; 이렇게 고쳤죠

그리고 한줄 더있었는데
//    HACMSTREAM__ *FStreamHandle;
    HACMSTREAM *FStreamHandle;

뒤에 언더바 두개 빼버렸습니다.

제가 빌더4에서 한것이라서 다른버젼에서는 다른방법으로 해야 할지도 모르겠습니다.
하지만 대충 제가한것을 응용해서 하시면 되리라 생각됩니다.
그리고 예제는 나중에 올려드리겠습니다.




+ -

관련 글 리스트
137 ACM (음성채팅) 컴포넌트 홍용혁 9881 2001/07/19
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.