Implementando IAMErrorLog
[O recurso associado a esta página, DirectShow, é um recurso herdado. Foi substituído por MediaPlayer, IMFMediaEngine e Audio/Video Capture in Media Foundation. Esses recursos foram otimizados para Windows 10 e Windows 11. A Microsoft recomenda fortemente que o novo código use MediaPlayer, IMFMediaEngine e Audio/Video Capture in Media Foundation em vez de DirectShow, quando possível. A Microsoft sugere que o código existente que usa as APIs herdadas seja reescrito para usar as novas APIs, se possível.]
[Não há suporte para essa API e pode ser alterada ou indisponível no futuro.]
A interface IAMErrorLog contém um único método, LogError. Os parâmetros para o método contêm informações sobre o erro ocorrido.
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.
O código de erro e a cadeia de caracteres de erro são definidos pelos Serviços de Edição do DirectShow. Para obter uma lista de erros, consulte Erros de renderização.
O parâmetro pExtraInfo contém um ponteiro para um tipo VARIANT que contém informações adicionais sobre o erro. O tipo de dados e o conteúdo da VARIANT dependem do erro específico ocorrido. Por exemplo, se o erro foi causado por um nome de arquivo incorreto, VARIANT é uma cadeia de caracteres com o nome de arquivo incorreto. Alguns erros não têm informações extras, portanto, pExtraInfo pode ser NULL. O código a seguir mostra como testar o membro vt da VARIANT, que indica o tipo de dados e formatar uma mensagem adequadamente.
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);
}
Observação
Não libere a VARIANT apontada por
Rótulo | Valor |
---|---|
|
. Além disso, variant torna-se inválido depois que o método retorna, portanto, não faça referência a ele mais tarde.
Tópicos relacionados