Re: ATL attributed проект и генерация ошибок
От: lkurts Россия http://lktalks.blogspot.com
Дата: 30.03.06 13:05
Оценка: 6 (1)
Здравствуйте, lkurts, Вы писали:

ЩЕ>>Подскажите плиз, где я прокололся? Ведь не может быть, что в МС добавили поддержку атрибутов, а генерация ошибок у них работать перестала?


L>Нигде не прокололся. Таки перестала работать генерация ошибок.


<-------skipped-------->

L>Обрати внимание на кусок которыый я пометил курсивом — в нем и есть ошибка. Для того

L>чтобы в VB пришла твоя ошибка должна быть заполнена EXCEPINFO *pExcepInfo, а она нигде
L>не заполняется — поэтому ошибка и не проходит. Там должно было бы быть что-то вроде

<-------skipped-------->


Хотел обновить информацию. В VS 2005 описанная проблема исправлена. Теперь в Injected код
компилятор вставляет следующее (в самый конец сгенерированного Invoke):


if (FAILED(hr) && pExcepInfo != NULL)
        {
            AtlExcepInfoFromErrorInfo(hr, pExcepInfo);
        }


Как видно, здесь вызывается новая функция (вроде бы ранее не существовашая) : AtlExcepInfoFromErrorInfo.
Она находится в файле: atlevent.h и выглядит так:


inline HRESULT AtlExcepInfoFromErrorInfo(HRESULT hrInvoke, EXCEPINFO *pExcepInfo)
    {
        if (pExcepInfo == NULL)
        {
            return E_POINTER;
        }
        pExcepInfo->pfnDeferredFillIn = NULL;
        pExcepInfo->scode = hrInvoke;
        CComPtr<IErrorInfo> spErrInfo;
        HRESULT hr = GetErrorInfo(0, &spErrInfo);
        if (SUCCEEDED(hr))
        {
            // Set up ErrInfo object
            // Ignore any errors. If additional error information is not
            // available then corresponding pointer will be NULL or 0
            spErrInfo->GetSource(&pExcepInfo->bstrSource);
            spErrInfo->GetDescription(&pExcepInfo->bstrDescription);
            spErrInfo->GetHelpFile(&pExcepInfo->bstrHelpFile);
            spErrInfo->GetHelpContext(&pExcepInfo->dwHelpContext);
        }
        return hr;
    }


Заметим что в двух выделенных строчках ошибка, поскольку GetErrorInfo может выдавать S_FALSE,
и тогда случится обращение к нулевому указателю. Об этом существует соответствующая KB artice:
http://support.microsoft.com/default.aspx?scid=kb;en-us;913940

Вот такие дела. Будьте бдительны!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.