【问题标题】:ICreateDevEnum works ok 32bit but fails on 64bitICreateDevEnum 在 32 位上工作,但在 64 位上失败
【发布时间】:2014-05-16 14:29:33
【问题描述】:

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

我在使用 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 类未注册”错误。

任何帮助或指点将不胜感激。

非常感谢

适用于 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]

【问题讨论】:

  • 我调整了帖子,因为错误代码被捕获在源代码布局中。错误是“0x80040154 类未注册”错误。

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


【解决方案1】:

类别不是 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);

【讨论】:

  • 谢谢 Roman R。我明白了。我知道这是我做错了 - 看起来我没有用敏锐的眼光浏览文档!再次感谢。正常工作。奇怪的是它如何作为 32 位版本工作。哦,好吧...从 RTFM 吸取的教训 :^)
猜你喜欢
  • 2016-09-27
  • 2011-03-04
  • 2015-11-15
  • 2012-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-16
相关资源
最近更新 更多