Что такое safecall?

Как будто вы пытаетесь получить доступ к объекту, который является null. Рассмотрим ниже пример:

TypeA objA;

. В это время вы только что объявили этот объект, но не инициализировали или не инициализировали. И всякий раз, когда вы пытаетесь получить доступ к каким-либо свойствам или методам в нем, он будет генерировать NullPointerException, что имеет смысл.

См. Также этот пример:

String a = null;
System.out.println(a.toString()); // NullPointerException will be thrown
16
задан Johan - reinstate Monica 10 December 2011 в 23:15
поделиться

3 ответа

Safecall передает параметры справа налево вместо Паскаля или регистра (значение по умолчанию) от левого до права

С safecall, процедура или функция удаляют параметры из стека после возврата (как Паскаль, но не как cdecl, где это до вызывающей стороны)

, Safecall реализует исключение 'брандмауэры'; особенно на Win32, это реализует межпроцессное уведомление об ошибке COM. Это иначе было бы идентично stdcall (другое соглашение о вызовах, используемое с API победы)

14
ответ дан 30 November 2019 в 17:05
поделиться

Кроме того, брандмауэры исключения работают путем вызова SetErrorInfo () с объектом, который поддерживает IErrorInfo, так, чтобы вызывающая сторона могла получить расширенную информацию об исключении. Это сделано TObject. SafeCallException переопределяют и в TComObject и в TAutoIntfObject. Оба из этих типов также реализуют ISupportErrorInfo для маркировки этого факта.

В случае исключения, вызывающая сторона safecall метода может запросить для ISupportErrorInfo, затем запросить, что для интерфейса, метод которого привел к отказу HRESULT (высокий набор битов), и если это возвращает S_OK, , GetErrorInfo () может получить информацию об исключении (описание, справка, и т.д., в форме реализации IErrorInfo, которая была передана SetErrorInfo () RTL Дельфи в переопределениях SafeCallException).

14
ответ дан 30 November 2019 в 17:05
поделиться

, Что Francois сказал и если бы это не было для safecall, Ваш вызов метода COM был бы похож ниже, и необходимо было бы сделать собственную проверку ошибок вместо того, чтобы получить исключения.

function AddSymbol(ASymbol: OleVariant; out Result: WordBool): HResult; stdcall;
3
ответ дан 30 November 2019 в 17:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: