Существует строронняя ПО, написанное на VB. Некоторые методы реализуют контроль ошибок созданием исключений.
ApplyEdit Method
The ApplyEdit method permanently applies changes made to an object’s properties after
the initial call to the BeginEdit method. The ApplyEdit method is defined as follows:
Public Sub ApplyEdit(ByRef Result As String, ByRef Severity As Integer)
If an error occurs, the ApplyEdit method raises an error condition and updates the Result
and Severity parameters with the Error Message and Severity of the error, respectively.
The Severity parameter is set to “0” if the error was critical, and to “1” if the error was
not critical. Your application should check the error state and act accordingly.
Я импортировал библиотеку типов. (
https://forum.shelek.ru/index.php/topic,11479.msg152373.html#msg152373)
Написал тестовое приложение и обнаружил, что на этом методе исключение не возникает.
Накидал аналогичное приложение на VB и проверил, что при тех же параметрах исключение возникает.
Начал рыться по инету (мусор один) и нашел упоминания, что для вызова методов COM-объектов в Delphi применяется соглашение safecall, которое перехватывает исключения во время работы методов. Т.к. я использую импорт библиотеки типов через паскалевские файлы (см. ссылку выше), то сие на меня также распространяется.
Если честно: за$&@!ся бороться. Нифига не врубаюсь.
Как мне узнать, что во время выполнения метода COM-объекта произошло исключение, которое средствами VCL было успешно подавлено?
В паскалевском файле объявлены интерфейсы и оберточные классы. Метод там объявлен так:
// interface
_JobCard = interface(IDispatch)
// ...
procedure ApplyEdit(var _Result: WideString; var Severity: Smallint); safecall;
// class
TJobCard = class(TOleServer)
// ...
procedure ApplyEdit(var _Result: WideString; var Severity: Smallint);
procedure TJobCard.ApplyEdit(var _Result: WideString; var Severity: Smallint);
begin
DefaultInterface.ApplyEdit(_Result, Severity);
end;
В автоматически генерящемся hpp-файле:
__interface _JobCards;
typedef System::DelphiInterface<_JobCards> _di__JobCards;
typedef _JobCards JobCards;
;
// ...
class DELPHICLASS TJobCard;
class PASCALIMPLEMENTATION TJobCard : public Oleserver::TOleServer
{
// ...
void __fastcall ApplyEdit(WideString &_Result, short &Severity);
// ...
};