ICreateDevEnum工作正常32位但在64位上失败

时间:2014-05-16 14:29:34

标签: c++ com directshow x86-64 windows-7-x64

我有一个奇怪的问题,我确信这是我正在做的事情,或者很可能,不做事。

我在使用Win7 Ultimate和WinSDK(x64)7.1的x64机器上使用'Studio 2010 Pro来开发DirectShow应用程序(为了记录,我也尝试过WinSDK7.0和7.0A)。我关心的问题是创建一个枚举器来枚举捕获设备,特别是使用CLSID_VideoInputDeviceCategory。我搜索过高低,当人们开发自己的过滤器并且过滤器没有正确注册时,才发现类似的问题。

然而,我终生无法弄明白是什么造成了这个......

以下最基本的示例代码使用32位x86构建成功,但更改为构建x64并且在

处失败
hr = CoCreateInstance(CLSID_VideoInputDeviceCategory,nullptr,CLSCTX_INPROC_SERVER,IID_PPV_ARGS(&pCreateDevEnum));

带有'0x80040154 Class not registered'错误。

非常感谢任何帮助或指示。

非常感谢

源代码的提取,适用于x86而非x64 ...

#include <Windows.h>
#include <dshow.h>

INT WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrev,LPSTR lpCmdLine,INT iCmdShow){
    ICreateDevEnum* pCreateDevEnum = nullptr;
    IEnumMoniker* pEnumMoniker = nullptr;
    HRESULT hr = S_OK;

    CoInitializeEx(nullptr,COINIT_MULTITHREADED);

    hr = CoCreateInstance(CLSID_VideoInputDeviceCategory,nullptr,CLSCTX_INPROC_SERVER,IID_PPV_ARGS(&pCreateDevEnum));

    if(FAILED(hr)){
    [...more code is omitted as its not needed to show it]

1 个答案:

答案 0 :(得分:2)

类别不是COM可创建的。这些是用于标识/列出某些类的类别的GUID,CoCreateInstance用于CLSID - COM类的标识符。

通过System Device Enumerator正确使用。另见:

// Create the System Device Enumerator.
ICreateDevEnum *pDevEnum;
HRESULT hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL,  
    CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pDevEnum));

if (SUCCEEDED(hr))
{
    // Create an enumerator for the category.
    hr = pDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory, 
        ppEnum, 0);