我有一个奇怪的问题,我确信这是我正在做的事情,或者很可能,不做事。
我在使用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]
答案 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);