2016-01-01 4 views
0

Рассмотрим эту программу:IAudioEndpointVolume не имеет ни одного члена с именем GetMasterVolumeLevelScalar

#include <stdio.h> 
#include <windows.h> 
#include <mmdeviceapi.h> 
#include <endpointvolume.h> 
#include <math.h> 
int main() { 
    IAudioEndpointVolume *wh; 
    IMMDevice *ya; 
    IMMDeviceEnumerator *xr; 
    CoInitialize(0); 
    CoCreateInstance(__uuidof(MMDeviceEnumerator), 0, CLSCTX_INPROC_SERVER, 
    __uuidof(IMMDeviceEnumerator), (void**)&xr); 
    xr->GetDefaultAudioEndpoint(eRender, eConsole, &ya); 
    ya->Activate(__uuidof(IAudioEndpointVolume), CLSCTX_ALL, 0, (void**)&wh); 
    float zu; 
    wh->GetMasterVolumeLevelScalar(&zu); 
    printf("%d\n", (int) round(100 * zu)); 
} 

Я могу компилировать как C++, без выпуска:

x86_64-w64-mingw32-g++ vol.cpp -lole32 

Однако, если я пытаюсь скомпилировать его как C:

x86_64-w64-mingw32-gcc vol.c -lole32 

Я получаю такие ошибки, как:

error: ‘IAudioEndpointVolume’ has no member named ‘GetMasterVolumeLevelScalar’ 

Эта программа, похоже, не особенно «C++», так что вызывает проблему ? Кроме того, могу ли я что-то изменить, чтобы он компилировался как C?

ответ

0

Это, кажется, сделать это:

#include <stdio.h> 
#include <initguid.h> 
#include <mmdeviceapi.h> 
#include <endpointvolume.h> 
#include <math.h> 
int main() { 
    IAudioEndpointVolume *wh; 
    IMMDevice *ya; 
    IMMDeviceEnumerator *xr; 
    CoInitialize(0); 
    CoCreateInstance(&CLSID_MMDeviceEnumerator, 0, CLSCTX_INPROC_SERVER, 
    &IID_IMMDeviceEnumerator, (void**)&xr); 
    xr->lpVtbl->GetDefaultAudioEndpoint(xr, eRender, eConsole, &ya); 
    ya->lpVtbl->Activate(ya, &IID_IAudioEndpointVolume, CLSCTX_ALL, 
    0, (void**)&wh); 
    float zu; 
    wh->lpVtbl->GetMasterVolumeLevelScalar(wh, &zu); 
    printf("%d\n", (int) round(100 * zu)); 
} 

Изменения:

  1. #include <initguid.h>
  2. &CLSID_MMDeviceEnumerator вместо __uuidof(MMDeviceEnumerator)
  3. lpVtbl->GetDefaultAudioEndpoint вместо GetDefaultAudioEndpoint

Source

Смежные вопросы