«Класс не зарегистрирован» при загрузке видеопроцессора MFT на Windows 7 - PullRequest
1 голос
/ 10 апреля 2020

У меня следующий 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

То есть класс COM для Video Процессор MFT не зарегистрирован. Я вижу, что 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. Используя редактор реестра на моем компьютере разработчика, я вижу ключ:

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 видеопроцессора неправильно. Есть ли более независимый от системы способ его загрузки?

Какой из этих выводов правильный? Можно ли загрузить видеопроцессор MFT на Windows 7? Если да, то как?

Ответы [ 2 ]

1 голос
/ 10 апреля 2020

Несмотря на то, что даже более старая документация для видеопроцессора MFT не содержит ограничений доступности, они все же могут быть приняты из связанного содержимого :

Требования

Минимально поддерживаемый клиент: Windows 8 Release Preview

Минимально поддерживаемый сервер: Windows Server 2012

Вероятны приложения, предназначенные для более ранних версий Windows предполагается использовать другие DSP , такие как DSP Color Control Transform и DSP Color Converter. Они были / не были ускорены на GPU.

Преимущество видеопроцессора MFT заключалось в том, что он поддерживал обработку видео с GPU-ускорением с использованием Microsoft Direct3D 11.

0 голосов
/ 10 апреля 2020

(Это расширение очень полезного комментария @ SimonMourier для будущих читателей, поскольку оно было для меня новым.)

Я считаю, что CLSID_VideoProcessorMFT доступно следующим образом:

  • Для "Windows Настольные приложения" в>> * Windows 8.1
  • Для "Windows Хранение приложений" в>> * Windows 10
  • Для "Windows Телефонные приложения "on> = Windows 10

Заголовочный файл mfidl.h содержит документы, в которых Windows версия содержит определенный класс c COM. После CLSID_VideoProcessorMFT к его определению, Я нахожу:

#if (WINVER >= _WIN32_WINNT_WINTHRESHOLD) 
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP)
// ...
EXTERN_GUID(CLSID_VideoProcessorMFT, 0x88753b26, 0x5b24, 0x49bd, 0xb2, 0xe7, 0xc, 0x44, 0x5c, 0x78, 0xc9, 0x82);
#endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP) */
#endif // (WINVER >= _WIN32_WINNT_WINTHRESHOLD) 
// ...
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
#if (WINVER >= _WIN32_WINNT_WINBLUE) 
#if (WINVER < _WIN32_WINNT_WINTHRESHOLD) 
EXTERN_GUID(CLSID_VideoProcessorMFT, 0x88753b26, 0x5b24, 0x49bd, 0xb2, 0xe7, 0xc, 0x44, 0x5c, 0x78, 0xc9, 0x82);
#endif // (WINVER < _WIN32_WINNT_WINTHRESHOLD) 
#endif // (WINVER >= _WIN32_WINNT_WINBLUE) 
// ...
#endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */

Следуя и расшифровав все эти макросы, я получил список доступности выше.

...