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

델파이 Q&A
Delphi Programming Q&A
[14710] Re:Re: 뭔가 착각하고 있나 보네요
하두고 [] 2077 읽음    2013-06-17 09:40
그냥 제어판의 사운드창을 백그라운드에 띄워놓고
창에 나열된 사운드 장치 정보를 읽어서
선택한 후 [기본장치]버튼을 눌러주도록 해서 처리했습니다.
뭐 간단하게 해결되네요.

하지만 문제는 사운드 장치 이름만 읽어오고
장치 이름 아래 있는 설명을 읽어올 수 없어 사운드 장치가 모두 "스피커"라고 표시되서
도데체 어느 스피커가 어떤 사운드 장치의 스피커인지 알 수가 없네요.

리버스엔지니어링 님이 쓰신 글 :
: 윈도우에서 디폴트 사운드 장치를 선택하는 방법은 제어판을 통한 방법 밖에 없습니다
: MS에서 그런 API를 제공했다간 사운드카드 만드는 회사들이 경쟁적으로 자기들 카드를 디폴트 사운드장치로
: 설정하려는 사태가 벌어지겠죠. 여러 사운드장치 중 하나로 웨이브 데이타가 출력되게 할수는 있어도 시스템 디폴트
: 사운드장치를 선택해주는 API는 없습니다.
:
: 해결 방법은 비스타 이후 COM으로 바뀐 윈도우 오디오 아키텍쳐를 리버스엔지니어링으로 해킹하는 방법 밖에는 없습니다.
: COM은 일반적인 API처럼 노출되는게 아니라 해킹하기도 쉽지 않습니다. 그럼에도 불구하고 정 필요하고 패이 조건이 맞으면
: 리버스엔지니어링으로 해킹해 드릴 수는 있습니다
:
:
:
: 하두고 님이 쓰신 글 :
: : 앞에서 했던 질문인데 시원한 답변이 없어 여기 저기 돌아다니며  찾은 소스코드입니다.
: : 아래 소스코드는 피시에 장착된 사운드장치를 나열하는 소스코드인데요.
: :
: : 아래 소스에서 나열된 사운드장치를 선택하여 더블클릭하면
: : 해당 사운드장치가 윈도우 기본 사운드장치로 바뀌게 하고 싶은데요.
: :
: : 기본 사운드 장치를 바꾸는 방법을 모르겠습니다.
: :
: : procedure TForm1.EnumAudioDevices;
: : var
: :   dsCreateDevEnum  : ICreateDevEnum;
: :   EnumDevice       : IEnumMoniker;
: :   DeviceMoniker    : IMoniker;
: :   Data             : Integer;
: :   DevicePropBag    : IPropertyBag;
: :   DeviceName       : OLEVariant;
: : begin
: :   If CoCreateInstance(CLSID_SystemDeviceEnum,nil,CLSCTX_INPROC_SERVER,IID_ICreateDevEnum,dsCreateDevEnum) = S_OK then
: :   Begin
: :     If dsCreateDevEnum.CreateClassEnumerator(CLSID_AudioRendererCategory,EnumDevice,0) = S_OK then
: :     Begin
: :       EnumDevice.Reset;
: :       While EnumDevice.Next(1,DeviceMoniker,@Data) = S_OK do
: :       Begin
: :         If DeviceMoniker.BindToStorage(nil,nil,IID_IPropertyBag,DevicePropBag) = NOERROR then
: :         Begin
: :           If DevicePropBag.Read('FriendlyName',DeviceName,nil) = NOERROR then
: :              IF Copy(DeviceName, 1, Length('DirectSound')) = 'DirectSound' Then
: :                 ListBox1.Items.Add(Copy(DeviceName, Length('DirectSound: ') + 1, Length(DeviceName) - Length('DirectSound: ')));
: :           DevicePropBag := nil;
: :         End;
: :         DeviceMoniker := nil;
: :       End;
: :       EnumDevice := nil;
: :     End;
: :     dsCreateDevEnum := nil;
: :   End;
: : End;

+ -

관련 글 리스트
14707 사운드장치 리스트 소스코드입니다. 여기서 기본 사운드장치 설정 방법 좀 알려주세요. 하두고 2657 2013/06/14
14709     Re: 뭔가 착각하고 있나 보네요 리버스엔지니어링 2117 2013/06/17
14710         Re:Re: 뭔가 착각하고 있나 보네요 하두고 2077 2013/06/17
14711             Re: COM 오브젝트를 인젝션해서 분석해보면 답이 나옴 지나다가 2229 2013/06/19
14712                 Re:Re: COM 오브젝트를 인젝션해서 분석해보면 답이 나옴 2071 2013/06/19
14713                     Re:Re:Re: COM 오브젝트를 인젝션해서 분석해보면 답이 나옴 하두고 1970 2013/06/19
14714                         Re: COM 코드 어셈블러로 작성한 것임 지나다가 2334 2013/06/20
14718                             Re:Re: COM을 어셈블러로 코딩하시다니 헐~ 델파이 2193 2013/06/22
14716                             Re:Re: 인젝션이 안 걸리는데요? 궁금이 1931 2013/06/20
14717                                 Re:Re:Re: 인젝션이 안 걸리는데요? 지나다가 2205 2013/06/20
14715                             Re:Re: 어셈코드 올려서 약올리는거 같아서 ... Lyn 2220 2013/06/20
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.