Реализация IAMErrorLog
[Функция, связанная с этой страницей DirectShow, является устаревшей функцией. Он был заменен MediaPlayer, IMFMediaEngine, и аудио/ видео захвата в Media Foundation. Эти функции оптимизированы для Windows 10 и Windows 11. Корпорация Майкрософт настоятельно рекомендует, чтобы новый код использовал MediaPlayer, IMFMediaEngine и аудио- и видеозахват в Media Foundation вместо DirectShow, когда это возможно. Корпорация Майкрософт предлагает переписать существующий код, использующий устаревшие API, чтобы по возможности использовать новые API.]
[Этот API не поддерживается и может быть изменен или недоступен в будущем.]
Интерфейс IAMErrorLog содержит один метод LogError. Параметры метода содержат сведения об ошибке, которая произошла.
STDMETHODIMP LogError(
LONG Severity, // Reserved. Do not use.
BSTR ErrorString, // Description.
LONG ErrorCode, // Error code.
HRESULT hresult, // HRESULT that caused the error.
VARIANT *pExtraInfo); // Extra information about the error.
Код ошибки и строка ошибки определяются службами редактирования DirectShow. Список ошибок см. в разделе Ошибки отрисовки.
Параметр pExtraInfo содержит указатель на тип VARIANT, содержащий дополнительные сведения об ошибке. Тип данных и содержимое VARIANT зависят от конкретной ошибки. Например, если ошибка была вызвана неправильным именем файла, variant является строкой с неправильным именем файла. Некоторые ошибки не содержат дополнительных сведений, поэтому pExtraInfo может иметь значение NULL. В следующем коде показано, как протестировать член vt variant, который указывает тип данных, и соответствующим образом отформатировать сообщение.
if( pExtraInfo ) // Report extra information, if any.
{
printf("\tExtra info: ");
if( pExtraInfo->vt == VT_BSTR ) // Extra info is a BSTR.
{
UINT len = SysStringLen(pExtraInfo->bstrVal);
char *szExtra = new char[len];
if (szExtra != NULL)
{
// Note - If the BSTR contains embedded NULL characters, this
// will only pick up the first sub-string.
WideCharToMultiByte(CP_ACP, 0, pExtraInfo->bstrVal, -1,
szExtra, len, 0, 0);
printf("%s\n", szExtra);
delete [] szExtra;
}
}
else if( pExtraInfo->vt == VT_I4 ) // Extra info is an integer.
printf("%d\n", pExtraInfo->lVal);
else if( pExtraInfo->vt == VT_R8 ) // Extra info is floating-point.
printf("%f\n", pExtraInfo->dblVal);
}
Примечание
Не освобождайте variant, на который указывает
Метка | Значение |
---|---|
|
. Кроме того, variant становится недопустимым после возврата метода, поэтому не ссылайтесь на него позже.
Связанные темы