我有一个奇怪的问题,我已经确信这是我正在做的事情,或者很可能是没有做的事情,这很愚蠢。
我正在使用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);
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句