Здравствуйте, 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
Вот такие дела. Будьте бдительны!