2008-09-18 19 views
16

Estoy trabajando en la creación de un EXE de ActiveX usando VB6, y el único ejemplo que obtuve está escrito en Delphi.¿Qué es safecall?

Al leer el código de ejemplo, noté que hay algunas funciones cuyas firmas son seguidas por la palabra clave safecall. Aquí hay un ejemplo:

function AddSymbol(ASymbol: OleVariant): WordBool; safecall; 

¿Cuál es el propósito de esta palabra clave?

+0

Respuesta

14

Safecall pasa parámetros de derecha a izquierda, en lugar de la pascal o registrarse (por defecto) de izquierda a derecha

Con Safecall, el procedimiento o función elimina parámetros desde la pila al regresar (como pascal, pero no les gusta cdecl donde corresponde a la persona que llama)

Safecall implementa excepciones 'firewalls'; esp en Win32, esto implementa la notificación de error COM entre procesos. De lo contrario sería idéntico a stdcall (la otra convención de llamadas utilizada con la API ganadora)

3

What Francois said y si no fuera por safecall, su llamada al método COM se habría visto a continuación y tendría que hacer su propia comprobación de errores en lugar de obtener excepciones.

function AddSymbol(ASymbol: OleVariant; out Result: WordBool): HResult; stdcall; 
14

Además, los cortafuegos de excepción trabajan llamando SetErrorInfo() con un objeto que admite IErrorInfo, de manera que la persona que llama puede obtener información detallada acerca de la excepción. Esto se realiza mediante la anulación de TObject.SafeCallException en TComObject y TAutoIntfObject. Ambos tipos también implementan ISupportErrorInfo para marcar este hecho.

En el caso de una excepción, el llamante del método safecall puede consultar ISupportErrorInfo, luego consultar que para la interfaz cuyo método resultó en un error HRESULT (alto bit set), y si eso devuelve S_OK, GetErrorInfo() puede obtener la excepción información (descripción, ayuda, etc., en la forma de implementación de IErrorInfo que se pasó a SetErrorInfo() por Delphi RTL en las excepciones de SafeCallException).