[英]ICreateDevEnum works ok 32bit but fails on 64bit
我有一个奇怪的问题,我已经确信那是我正在做的事情,或者很可能是没有做的事,这很愚蠢。
我在使用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]
类别不是COM创建的。 这些是用于标识/列出某些类的类别的GUID, CoCreateInstance
与CLSID(COM类的标识符)一起使用。
正确的用法是通过系统设备枚举器 。 也可以看看:
// 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);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.