QueryInterface의 첫 번째 매개변수에 전달하는 IID의 외부 참조를 어떻게 해야하나요?
글쓴이: mydream / 작성시간: 목, 2015/11/26 - 6:29오후
hr=lpds->CreateSoundBuffer(&dsbdesc, &pDsb, NULL); if( SUCCEEDED(hr) ) { hr=pDsb->QueryInterface(IID_IDirectSoundBuffer, (LPVOID*)&ppDsb8);//IID_IDirectSoundBuffer8 pDsb->Release(); }
IDirectSoundBuffer8으로 변환된 인터페이스를 얻기 위해 QueryInterface를 사용한 뒤 컴파일 했는데 저 첫 번째 인자로 전달된 IID_IDirectSoundBuffer을 외부참조할 수 없다면 LNK2001 오류를 컴파일러가 토해냅니다. 그래서 IID에 관련해서 알아보니, mapiguid.h를 포함해야 한다고 하더라고요. 그래서 경로를 알아내서 상대경로로 루트까지 거슬러 올라가 해당 경로를 다음과 같이 include했습니다.
#include "\..\..\..\..\..\..\Program Files\Microsoft Visual Studio 9.0\SmartDevices\SDK\Smartphone2003\include\mapiguid.h"
그리고 컴파일 해도 IID 외부참조할 수 없다는 LNK2001를 뿜어냅니다. 어떻게 해야 IID_IDirectSoundBuffer를 참조할 수 있나요?
코드 전부를 올리면 질문의 요지가 명확하지 않을 것 같아서 처음에 언급하지 않았습니다. 혹시 아래 전체 코드가 전체를 이해하는데 도움이 되지 않을까해서 올려봅니다.
#include <windows.h> #include <tchar.h> #pragma comment(lib, "dsound.lib") //#pragma comment(lib, "..\\..\\..\\..\\..\\..\\..\\Program Files/Microsoft DirectX SDK (June 2010)\\Lib\\x86\\dsound.lib") #include <dsound.h> #include "\..\..\..\..\..\..\Program Files\Microsoft Visual Studio 9.0\SmartDevices\SDK\Smartphone2003\include\mapiguid.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; if(lpGUID!=NULL) { //_stprintf(tmbuffer, TEXT("lpGUID %lx-%x-%x-%x%x-%.2x%.2x%.2x%.2x%.2x%.2x lpszDesc %s lpszDrvName %s"), lpGUID->Data1, lpGUID->Data2, lpGUID->Data3, // lpGUID->Data4[0], lpGUID->Data4[1], lpGUID->Data4[2], lpGUID->Data4[3], lpGUID->Data4[4], // lpGUID->Data4[5], lpGUID->Data4[6], lpGUID->Data4[7] // , lpszDesc, lpszDrvName); //MessageBox(localHwnd, tmbuffer, NULL, MB_OK); IDirectSound8* lpds;//typedef IDirectSound8 *LPDIRECTSOUND8 HRESULT hr=DirectSoundCreate8(NULL, &lpds, NULL); //_stprintf(tmbuffer, TEXT("%p"), lpds); //MessageBox(localHwnd, tmbuffer, NULL, MB_OK); //how to create IDirectSoundBuffer8 WAVEFORMATEX wfx; memset(&wfx, 0, sizeof(WAVEFORMATEX)); wfx.wFormatTag=WAVE_FORMAT_PCM; wfx.nChannels=2; wfx.nSamplesPerSec=22050; wfx.wBitsPerSample=16; wfx.nBlockAlign=wfx.nChannels*wfx.wBitsPerSample/8; wfx.nAvgBytesPerSec=wfx.nSamplesPerSec*wfx.nBlockAlign; DSBUFFERDESC dsbdesc; memset(&dsbdesc, 0, sizeof(DSBUFFERDESC)); dsbdesc.dwSize=sizeof(DSBUFFERDESC); dsbdesc.dwFlags=DSBCAPS_CTRLPAN | DSBCAPS_CTRLVOLUME | DSBCAPS_CTRLFREQUENCY | DSBCAPS_GLOBALFOCUS; dsbdesc.dwBufferBytes=3*wfx.nAvgBytesPerSec; dsbdesc.lpwfxFormat=&wfx; LPDIRECTSOUNDBUFFER pDsb=NULL;//LPDIRECTSOUNDBUFFER LPDIRECTSOUNDBUFFER8 ppDsb8; hr=lpds->CreateSoundBuffer(&dsbdesc, &pDsb, NULL); if( SUCCEEDED(hr) ) { hr=pDsb->QueryInterface(IID_IDirectSoundBuffer, (LPVOID*)&ppDsb8);//IID_IDirectSoundBuffer8 pDsb->Release(); } } else { _stprintf(tmbuffer, TEXT("lpszDesc %s lpszDrvName %s"), lpszDesc, lpszDrvName); MessageBox(localHwnd, tmbuffer, NULL, MB_OK); } return TRUE; } 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); }
Forums:
이거 보고 따라해보세요.
잘 되는 예제를 따라하시기 바랍니다.
http://www.codeproject.com/Articles/7474/Sound-Generator-How-to-create-alien-sounds-using-m
DirectX SDK 를 설치하면. 예제소스가 있습니다.
다이렉트X "DirectX SDK"
http://file.daum.net/search.php?w=&q=DirectX+SDK
각 함수 설명은 이렇습니다.
IUnknown::QueryInterface method
https://msdn.microsoft.com/ko-kr/library/windows/desktop/ms682521(v=vs.85).aspx
관련된 책은 이렇습니다.
http://book.naver.com/search/search.nhn?sm=sta_hty.book&sug=&where=nexearch&query=DirectX
----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.
매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.
각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com
댓글 달기