C++ 为什么CoCreateInstance在某些窗口上返回REGDB_E_CLASSNOTREG?

C++ 为什么CoCreateInstance在某些窗口上返回REGDB_E_CLASSNOTREG?,c++,audio,com,directshow,windows-server-2016,C++,Audio,Com,Directshow,Windows Server 2016,我想在我的一个应用程序中使用,所以我加载它。下面是一个小片段: #include <iostream> #include <strmif.h> #include <uuids.h> int main() { std::cout << "Start" << std::endl; HRESULT hr = CoInitialize(NULL); printf("CoInitialize = 0x%x\n", h

我想在我的一个应用程序中使用,所以我加载它。下面是一个小片段:

#include <iostream>
#include <strmif.h>
#include <uuids.h>

int main()
{
    std::cout << "Start" << std::endl;

    HRESULT hr = CoInitialize(NULL);

    printf("CoInitialize = 0x%x\n", hr);

    IBaseFilter* ptr = NULL;
    hr = CoCreateInstance(CLSID_DSoundRender, NULL, CLSCTX_INPROC, IID_IBaseFilter, (void**)&ptr);

    printf("CoCreateInstance = 0x%x\n", hr);

    ptr->Release();

    CoUninitialize();

    std::cout << "End" << std::endl;

    std::cin.get();
}
我也用过,每个电话看起来都是正确的

我应该如何更改客户端的配置以使其正常工作?

在“备注”部分下,此DirectShow筛选器应如何参与DirectShow图形管道:

此筛选器充当音频设备的包装器。要枚举用户系统上可用的音频设备,请将ICreateDevEnum接口与音频渲染器类别(CLSID_AudioRenderCategory)一起使用。对于每个音频设备,“音频渲染器”类别包含两个过滤器实例。其中一个对应于DirectSound渲染器,另一个对应于音频渲染器(WaveOut)过滤器。DirectSound实例的友好名称为“DirectSound:DeviceName”,其中DeviceName是设备的名称。WaveOut实例具有友好的名称DeviceName

请注意,您通常不应该直接使用您正在执行的
CoCreateInstance
实例化过滤器。这有一个很好的理由:它是一个包装对象,通常需要它的初始化上下文,从而将它绑定到特定的音频输出设备。通过直接初始化,您可以隐式地指示它使用默认设备

在没有音频输出设备的系统上,过滤器将看不到任何设备,并可能在早期实例化步骤中发出故障,导致COM错误。您将看到COM注册,但缺少硬件和早期故障将触发通用COM错误,而不是特定于API的错误


一般来说,您仍然应该更喜欢使用
ICreateDevEnum
接口(如MSDN建议的那样)而不是
CoCreateInstance
“我检查了注册表,相应的DLL(quartz.DLL)已正确注册”-显然没有,否则
CoCreateInstance()
不会抱怨注册丢失。您使用的是32位还是64位Windows?你的应用程序是32位还是64位?顺便说一句,如果
CoCreateInstance()
成功,那么您的代码就会出现内存泄漏。您需要将
void*ptr
更改为
IBaseFilter*ptr
,然后在使用完后调用
ptr->Release()
,然后再调用
coninitialize()
“咬这样的东西。您是在32位上写,还是在64位上测试,反之亦然?你查过CLSID_DSoundRender并确认HKCR\CLSID\{CLSID_DSoundRender的数值等价物}有一个指向正确文件的Inprocserver32键吗?@RemyLebeau我在我的原始帖子中回答了你的问题:应用程序是32位的,主机是64位的(Winodws 10和Windows Server 2016)。我还纠正了内存泄漏。@JosephWillcoxson我在我的原始帖子中回答了你的问题:CLSID是79376820-07D0-11CF-A24D-0020AFD79767,
InProcServer
的默认值指向DLL的正确路径:
C:\Windows\SysWOW64\quartz.DLL
。它由
procmon.exe
确认。
PS C:\Users\pierre> Get-ChildItem -Path "Registry::HKCR\CLSID\{79376820-07D0-11CF-A24D-0020AFD79767}"


    Hive: HKCR\CLSID\{79376820-07D0-11CF-A24D-0020AFD79767}


Name                           Property
----                           --------
InprocServer32                 (default)      : C:\Windows\System32\quartz.dll
                               ThreadingModel : Both


PS C:\Users\pierre> Get-ChildItem -Path "Registry::HKCR\WOW6432Node\CLSID\{79376820-07D0-11CF-A24D-0020AFD79767}"


    Hive: HKCR\WOW6432Node\CLSID\{79376820-07D0-11CF-A24D-0020AFD79767}


Name                           Property
----                           --------
InprocServer32                 (default)      : C:\Windows\SysWOW64\quartz.dll
                               ThreadingModel : Both

PS C:\Users\pierre> dir C:\Windows\System32\quartz.dll


    Répertoire : C:\Windows\System32


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----       15/09/2018     09:29        1639424 quartz.dll


PS C:\Users\pierre> dir C:\Windows\SysWOW64\quartz.dll


    Répertoire : C:\Windows\SysWOW64


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----       15/09/2018     09:29        1470464 quartz.dll