Как будто вы пытаетесь получить доступ к объекту, который является null
. Рассмотрим ниже пример:
TypeA objA;
. В это время вы только что объявили этот объект, но не инициализировали или не инициализировали. И всякий раз, когда вы пытаетесь получить доступ к каким-либо свойствам или методам в нем, он будет генерировать NullPointerException
, что имеет смысл.
См. Также этот пример:
String a = null;
System.out.println(a.toString()); // NullPointerException will be thrown
Safecall передает параметры справа налево вместо Паскаля или регистра (значение по умолчанию) от левого до права
С safecall, процедура или функция удаляют параметры из стека после возврата (как Паскаль, но не как cdecl, где это до вызывающей стороны)
, Safecall реализует исключение 'брандмауэры'; особенно на Win32, это реализует межпроцессное уведомление об ошибке COM. Это иначе было бы идентично stdcall (другое соглашение о вызовах, используемое с API победы)
Кроме того, брандмауэры исключения работают путем вызова SetErrorInfo () с объектом, который поддерживает IErrorInfo, так, чтобы вызывающая сторона могла получить расширенную информацию об исключении. Это сделано TObject. SafeCallException переопределяют и в TComObject и в TAutoIntfObject. Оба из этих типов также реализуют ISupportErrorInfo для маркировки этого факта.
В случае исключения, вызывающая сторона safecall метода может запросить для ISupportErrorInfo, затем запросить, что для интерфейса, метод которого привел к отказу HRESULT (высокий набор битов), и если это возвращает S_OK, , GetErrorInfo () может получить информацию об исключении (описание, справка, и т.д., в форме реализации IErrorInfo, которая была передана SetErrorInfo () RTL Дельфи в переопределениях SafeCallException).
, Что Francois сказал и если бы это не было для safecall, Ваш вызов метода COM был бы похож ниже, и необходимо было бы сделать собственную проверку ошибок вместо того, чтобы получить исключения.
function AddSymbol(ASymbol: OleVariant; out Result: WordBool): HResult; stdcall;