【问题标题】:QT Include Windows SDK LibraryQT 包含 Windows SDK 库
【发布时间】:2020-04-07 21:34:16
【问题描述】:

我是 Qt 新手,我想使用 Windows SDK 中的 AudioSessionManager2。在使用 this example 的 Qt Creator 中,我在下面编写了附加代码。

编译时我收到消息

对 `__imp_CoCreateInstance' 的未定义引用
对 `IID_IAudioSessionManager2' 的未定义引用

documentation for the core audio APIs 中,Microsoft 声明 API 在 Mmdevapi.dll 和 Audioses.dll 中实现。虽然我希望找到我用 Visual Studio 下载的 SDK 的两个匹配的 .lib 文件,但我只找到了 mmdevapi.lib。将其复制到我的项目并将其添加到 qt 项目文件中后,如下所示,我仍然没有成功并出现相同的错误消息。

我应该如何知道要为哪些函数导入哪些 lib 文件?
如何获取这些 lib 文件?
我是否正确导入了 lib 文件?


audiomanager.h:

#ifndef AUDIOMANAGER_H
#define AUDIOMANAGER_H

#include <mmdeviceapi.h>
#include <audiopolicy.h>
#include "utils/SafeRelease.h"


class AudioManager {

public:
    AudioManager();
    ~AudioManager();

private:
    IAudioSessionManager2 *pSessionManager = nullptr;
    HRESULT init();


};

#endif // AUDIOMANAGER_H

audiomanager.cpp

#include "audiomanager.h"


AudioManager::AudioManager () {
    this->init();
}


AudioManager::~AudioManager () {
    SafeRelease(&pSessionManager);
}



HRESULT AudioManager::init () {
    HRESULT hr = S_OK;

    // initialize needed vars
    IMMDeviceEnumerator *pDeviceEnumerator = nullptr;
    IMMDevice *pDevice = nullptr;

    // get device enumerator
    hr = CoCreateInstance(
                __uuidof(MMDeviceEnumerator),
                nullptr,
                CLSCTX_ALL,
                IID_PPV_ARGS(&pDeviceEnumerator)
                );
    if (FAILED(hr))
        goto done;

    // get the default audio output (for consoles)
    // !!! only for consoles? (games, system, etc.), no  music, video
    pDeviceEnumerator->GetDefaultAudioEndpoint(eRender, eConsole, &pDevice);
    if (FAILED(hr))
        goto done;

    // get the session manager
    hr = pDevice->Activate(
                IID_IAudioSessionManager2,
                CLSCTX_ALL,
                nullptr,
                reinterpret_cast<void**>(&pSessionManager)
                );

done:
    SafeRelease(&pDeviceEnumerator);
    SafeRelease(&pDevice);
    return hr;
}

Qt 项目文件中的行

LIBS += "$$PWD\..\libs\mmdevapi.lib"

【问题讨论】:

  • CoCreateInstanceOle32.lib 的一部分,
  • 对于另一个,我不完全确定,但试试uuid.lib(其他 IID_ 在里面)
  • 感谢 cmets。 @ChrisMM Ole32.Lib 是正确的 - 我如何自己找出答案?是否有任何文档或任何提示?不幸的是Uuid.lib 没有包含IID_IAudioSessionManager2
  • 您可以在docs.micrsoft.com 上查找函数,并在底部列出了头文件、dll 和库。但是我找不到 AudioSessionManager 的,因为文档只引用头文件,而不是库。

标签: c++ qt sdk windows-10 windows-10-sdk


【解决方案1】:

经过几个小时的尝试,我发现它可以使用

// get the session manager
hr = pDevice->Activate(
            __uuidof(IAudioSessionManager2),
            CLSCTX_ALL,
            nullptr,
            reinterpret_cast<void**>(&pSessionManager)
            );

而不是

// get the session manager
hr = pDevice->Activate(
            IID_IAudioSessionManager2,
            CLSCTX_ALL,
            nullptr,
            reinterpret_cast<void**>(&pSessionManager)
            );

我不知道,为什么我找不到适合 IID_IAudioSessionManager 的库,也不知道为什么 Microsoft 源代码示例列出了这个,但提供的另一个选项似乎有效。

【讨论】:

    猜你喜欢
    • 2011-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多