DSEnumProc이 호출되게 할 수 있을까요?
글쓴이: mydream / 작성시간: 일, 2015/11/22 - 3:13오후
DSEnumProc에서 messageBox가 뜨지 않습니다. DSEnumProc 함수가 호출되지 않습니다. 어떻게 해야 저 프로시저를 호출할 수 있을까요?
#include <windows.h> #include <tchar.h> #pragma comment(lib, "Dsound.lib") #include <DSound.h> LRESULT CALLBACK WinProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam); int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) { WNDCLASS wndCls; wndCls.cbClsExtra=0; wndCls.cbWndExtra=0; wndCls.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH); wndCls.hCursor=LoadCursor(NULL, IDC_ARROW); wndCls.hIcon=NULL; wndCls.hInstance=hInstance; wndCls.lpfnWndProc=WinProc; wndCls.lpszClassName=TEXT("test38888"); wndCls.lpszMenuName=NULL; wndCls.style=CS_HREDRAW | CS_VREDRAW; RegisterClass(&wndCls); HWND hwnd=CreateWindow(wndCls.lpszClassName, TEXT("audio test"), WS_OVERLAPPEDWINDOW, 300, 300, 500, 500, NULL, NULL, hInstance, NULL); ShowWindow(hwnd, nShowCmd); MSG message; while( GetMessage(&message, NULL, 0, 0) ) { TranslateMessage(&message); DispatchMessage(&message); } return message.wParam; } BOOL CALLBACK DSEnumProc(LPGUID lpGUID, LPCTSTR lpszDesc, LPCTSTR lpszDrvName, LPVOID lpContext) { HWND localHwnd=(HWND)lpContext; TCHAR tmbuffer[1024]; lpGUID->Data1; //_stprintf(tmbuffer, TEXT("%lu"), (unsigned long)(lpGUID->Data1)); MessageBox(localHwnd, TEXT("ppp"), NULL, MB_OK); return TRUE; } LRESULT CALLBACK WinProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam) { switch(message) { case WM_CREATE: DirectSoundEnumerate( (LPDSENUMCALLBACK)DSEnumProc, (VOID*)&hwnd ); break; case WM_DESTROY: PostQuitMessage(0); break; } return DefWindowProc(hwnd, message, wparam, lparam); }
Forums:
호출은 되는데요.
//주소를 빼셔야 값을 확인하실 수 있습니다.
DirectSoundEnumerate( (LPDSENUMCALLBACK)DSEnumProc, (VOID*)hwnd );
//
lpGUID 값이 0 일때의 처리를 확인해보셔야 합니다.
----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.
매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.
각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com
지금 막 해봤더니 되는군요. 감사합니다.
네, 그렇게 해봤더니 됩니다. 답변 감사드립니다. 그런데 첫 번째는 항상 lpGUID가 널이던데요. 그건 Primary Sound Device라고 하더군요. 그런데 식별된 값이 없는 NULL값으로 저 장치에 어떻게 접근하라는 것인지 모르겠습니다. 지금 그 해답을 찾고 있는 중이고요.
DirectSoundEnumerate의 호출부를 조금 바꿔봤습니다.
MSDN 메뉴얼에 설명된 대로 DirectSoundEnumerate를 다음과 같이 바꿔봤습니다.
저렇게 바꾸지 않아도 두 번 DSEnumProc 함수가 두 번 호출되는 것은 동일하던데요. 저런 방식의 코드 언급이 왜 필요한 것인가요? 그리고 return true 대신 break를 언급하면 안 되는 것인가요?
그리고 첫 번째 프라이머리 디바이스도 역시 적절한 이름과 GUID로 열거될 수 있다고 설명돼 있지만 GUID가 NULL이었는데 저 GUID를 또 어떻게 열거한다는 것인지 궁금합니다. 다음 링크에서 참고했습니다.
https://msdn.microsoft.com/ko-kr/library/windows/desktop/ee417545(v=vs.85).aspx
마지막 글에요
The primary device is also enumerated with its proper name and GUID.
(처음의 디바이스는 적절한 이름과 GUID로 또한 열거된다.)
참고해보세요.
저도 확인해보니. 그렇네요.
저는 사운드 드라이버가 설치되어 있지 않아서인지. 한번만 호출되고 있습니다.
호출 횟수를 다른 컴퓨터에서도 확인해보시기 바랍니다.
------------------------------------------------------------------------------------------------------------------
CALLBACK DSEnumProc()
https://translate.google.co.kr/translate?sl=en&tl=ko&js=y&prev=_t&hl=ko&ie=UTF-8&u=https%3A%2F%2Fmsdn.microsoft.com%2Fko-kr%2Flibrary%2Fwindows%2Fdesktop%2Fee417545&edit-text=&act=url
당신은 어떤 이름을 부여 할 수 있지만 같은 형태로 선언해야 DSEnumCallback의 프로토 타입. 열거 계속하는 것입니다,
또는 그렇지 않으면 FALSE 경우 콜백 함수는 TRUE를 반환해야합니다.
열거 된 첫 번째 장치는 항상 기본 사운드 드라이버라고하며 콜백의 lpGUID 매개 변수는 NULL이다
------------------------------------------------------------------------------------------------------------------
DirectSoundEnumerate()
https://msdn.microsoft.com/ko-kr/library/windows/desktop/microsoft.directx_sdk.reference.directsoundenumerate(v=vs.85).aspx
DirectSoundEnumerate
The DirectSoundEnumerate function enumerates the DirectSound drivers installed in the system.
HRESULT DirectSoundEnumerate(
LPDSENUMCALLBACK lpDSEnumCallback,
LPVOID lpContext
)
lpDSEnumCallback
Address of the DSEnumCallback function that will be called for each device installed in the system.
lpContext
Address of the user-defined context passed to the enumeration callback function every time that function is called.
If the function succeeds, it returns DS_OK. If it fails, the return value may be DSERR_INVALIDPARAM.
----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.
매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.
각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com
댓글 달기