什么是安全电话?
时间:2020-03-06 14:23:06 来源:igfitidea点击:
我正在使用VB6创建ActiveX EXE,而我得到的唯一示例都是用Delphi编写的。
阅读示例代码后,我注意到有一些函数的签名后面带有safecall关键字。这是一个例子:
function AddSymbol(ASymbol: OleVariant): WordBool; safecall;
此关键字的目的是什么?
解决方案
Safecall从右向左传递参数,而不是从左向右传递Pascal或者寄存器(默认值)
使用safecall时,过程或者函数会在返回时从堆栈中删除参数(例如pascal,但不像cdecl取决于调用方)
Safecall实现例外"防火墙";尤其是在Win32上,它实现了进程间COM错误通知。否则它将与stdcall相同(与win api一起使用的另一种调用约定)
弗朗索瓦(Francois)所说的话,如果不是为了安全调用,则COM方法调用将如下所示,我们将必须进行自己的错误检查而不是获取异常。
function AddSymbol(ASymbol: OleVariant; out Result: WordBool): HResult; stdcall;
此外,异常防火墙通过使用支持IErrorInfo的对象调用SetErrorInfo()来工作,以便调用者可以获得有关异常的扩展信息。这是通过TComObject和TAutoIntfObject中的TObject.SafeCallException重写完成的。这两种类型都还实现了ISupportErrorInfo来标记这一事实。
如果发生异常,safecall方法的调用者可以查询ISupportErrorInfo,然后查询其方法导致失败的接口HRESULT(高位设置),如果返回S_OK,则GetErrorInfo()可以获取异常信息(说明,帮助等,形式为IErrorInfo实现的形式,该实现由Delphi RTL在SafeCallException替代中传递给SetErrorInfo()。