winapi - 在 Windows 7 上加载视频处理器 MFT 时出现 "Class not registered"

标签 winapi dll com windows-7 ms-media-foundation

我有以下 COM 调用:

IMFTransform* pMFT = NULL;
HRESULT hr = CoCreateInstance(CLSID_VideoProcessorMFT, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pMFT));

在我的开发计算机上,对 CoCreateInstance 的调用成功。 然而,当我在我的旧 Windows 7 机器上部署它时, 对 CoCreateInstance 的调用失败, 我不知道为什么。 这是我显示错误的方式:

_com_error err(hr);
LPCTSTR hrErrMsg = err.ErrorMessage();
WCHAR msg[MAX_PATH];
StringCbPrintf(msg, sizeof(msg), L"HRESULT=0x%X, %s", errContext, hrErr, hrErrMsg);
MessageBox(hwnd, msg, L"Error", MB_ICONERROR);

这是我在该消息框中收到的错误:

HRESULT=0x80040154, Class not registered

the Video Processor MFT 的 COM 类 未注册。 我看到 CLSID_VideoProcessorMFT 定义为:

EXTERN_GUID(CLSID_VideoProcessorMFT, 0x88753b26, 0x5b24, 0x49bd, 0xb2, 0xe7, 0xc, 0x44, 0x5c, 0x78, 0xc9, 0x82);

这是伪装的 GUID 88753B26-5B24-49bd-B2E7-0C445C78C982。 据我所知,COM 类是在 Windows 注册表中使用包含此 GUID 的 key 注册的。 在我的开发机器上使用注册表编辑器,我可以看到 key :

HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{88753B26-5B24-49bd-B2E7-0C445C78C982}

并且此键的“默认”值为%SystemRoot%\System32\msvproc.dll, 引用文件路径C:\Windows\System32\msvproc.dll, 确实存在。

在我的旧 Windows 7 机器上,注册表中的此项不存在 -- 正如预期的那样,出现“类未注册”错误。 并且C:\Windows\System32\msvproc.dll处没有文件。 但这就是线索变冷的地方。 我不知道应该在注册表中注册该类, 以及为什么它不能在我的旧 Windows 7 机器上运行。

可能的结论:

  • 我必须自己注册视频处理器 MFT。 然而,文档并不建议这样做, 我不知道该怎么做。
  • Windows 7 不支持视频处理器 MFT。 但文档没有提供任何迹象。 事实上,他们说“Media Foundation 需要 Windows Vista 或更高版本”, 其中应该包括我的 Windows 7 计算机。
  • 我以错误的方式加载视频处理器 MFT。 有没有更独立于系统的加载方式?

以下哪一个是正确的结论?是否可以在 Windows 7 上加载视频处理器 MFT?如果是这样,怎么办?

最佳答案

尽管即使older documentation for Video Processor MFT没有提到可用性限制,它们仍然可以从 related content 假设:

Requirements

Minimum supported client: Windows 8 Release Preview

Minimum supported server: Windows Server 2012

针对早期版本 Windows 的应用程序可能应该使用 other DSPs如色彩控制变换 DSP 和色彩转换器 DSP。不过,这些都没有经过 GPU 加速。

视频处理器 MFT 的优势在于它支持使用 Microsoft Direct3D 11 的 GPU 加速视频处理。

关于winapi - 在 Windows 7 上加载视频处理器 MFT 时出现 "Class not registered",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61140795/

相关文章:

c# - 如何隐藏excel列?

c++ - 在 C++ WIN32 中识别后台进程并将其置于前台

c - 单链表(如何正确删除/释放实体?)

c++ - dll shell 扩展如何知道要执行的程序位置?

dll - 从 DLL 导出生成 header

dll - 如何在 Inno Setup 中安装和卸载时使用具有依赖项的 DLL?

c++ - Axapta 商务连接器

c - 使用几个线程使用 WINAPI

c++ - 创建拖放事件 C++

c++ - 在 C++ 中加载 CLR,Start() 问题