Соглашение о вызовах для этого должно быть, вероятно, stdcall
, а не safecall
:
function ADsGetObject(lpszPathName:WideString; const riid:TGUID; out ppObject):HRESULT; safecall; external 'activeds.dll';
Повтор
Типичные функции COM возвращают результат HRESULT
;Они используют его для передачи кода ошибки или S_OK
, если все прошло нормально.Используя этот тип функции, у вас обычно будет такой код:
if CallComFunction(parameters) = S_OK then
begin
// Normal processing goes here
end
else
begin
// Error condition needs to be dealt with here.
end
Поскольку с ошибками обычно невозможно справиться, Delphi предоставляет нам safecall
соглашение о псевдо-вызове.Это не настоящее соглашение о вызовах, потому что на самом деле оно использует stdcall
за кулисами.Он автоматически генерирует тест для S_OK
и при ошибке выдает ошибку.Таким образом, типичный метод COM может быть объявлен как один из следующих:
function TypicalComFunction(Parameters): HRESULT; stdcall;
procedure TypicalComFunction(Parameters); safecall;
Если вы не намерены иметь дело с какими-либо потенциальными ошибками, используйте вторую форму (с safecall
) и просто игнорируйте потенциальныеисключение.Если ошибка все же возникает, Delphi вызывает исключение, и это исключение будет всплывать, пока не достигнет точки в приложении, которая может устранить ошибку.Или он всплывает, пока не достигнет обработчика исключений приложения, и используется для отображения ошибки для пользователя.
При использовании safecall
типичный код, приведенный выше, выглядит следующим образом:
TypicalComFunction(Parameters); // raises exception on error
// Normal processing goes here
С другой стороны, если вам действительно нужен HRESUL
, даже если он отличается от S_OK
, используйте вариант stdcall
.