DSEnumProc이 호출되게 할 수 있을까요?

mydream의 이미지

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);
}
shint의 이미지

//주소를 빼셔야 값을 확인하실 수 있습니다.
DirectSoundEnumerate( (LPDSENUMCALLBACK)DSEnumProc, (VOID*)hwnd );

//
lpGUID 값이 0 일때의 처리를 확인해보셔야 합니다.

----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.

매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.

각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com

mydream의 이미지

네, 그렇게 해봤더니 됩니다. 답변 감사드립니다. 그런데 첫 번째는 항상 lpGUID가 널이던데요. 그건 Primary Sound Device라고 하더군요. 그런데 식별된 값이 없는 NULL값으로 저 장치에 어떻게 접근하라는 것인지 모르겠습니다. 지금 그 해답을 찾고 있는 중이고요.

mydream의 이미지

MSDN 메뉴얼에 설명된 대로 DirectSoundEnumerate를 다음과 같이 바꿔봤습니다.

LRESULT CALLBACK WinProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam) {
	switch(message) {
		case WM_CREATE:
			if(  FAILED( DirectSoundEnumerate( (LPDSENUMCALLBACK)DSEnumProc, (VOID*)hwnd ) )  ) {
				return TRUE;
			}
			break;
		case WM_DESTROY:
			PostQuitMessage(0);
			break;
 
	}
	return DefWindowProc(hwnd, message, wparam, lparam);
}

저렇게 바꾸지 않아도 두 번 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로 또한 열거된다.)

shint의 이미지

저도 확인해보니. 그렇네요.
저는 사운드 드라이버가 설치되어 있지 않아서인지. 한번만 호출되고 있습니다.
호출 횟수를 다른 컴퓨터에서도 확인해보시기 바랍니다.

------------------------------------------------------------------------------------------------------------------
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

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.