代码之家  ›  专栏  ›  技术社区  ›  Mario Marinato

什么是SafeCall?

  •  16
  • Mario Marinato  · 技术社区  · 18 年前

    我正在使用vb6创建一个ActiveX exe,我得到的唯一例子都是用delphi编写的。

    在阅读示例代码时,我注意到有一些函数的签名后面跟着 保险箱 关键字。下面是一个例子:

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

    这个关键字的目的是什么?

    4 回复  |  直到 18 年前
        1
  •  14
  •   Francesca    18 年前

        2
  •  14
  •   Barry Kelly    18 年前
        3
  •  3
  •   Community Mohan Dere    9 年前

    What Francois said

    function AddSymbol(ASymbol: OleVariant; out Result: WordBool): HResult; stdcall;
    
        4
  •  2
  •   Ian Boyd    8 年前

    HRESULT

    IThingy = interface
       ['{357D8D61-0504-446F-BE13-4A3BBE699B05}']
       function AddSymbol(ASymbol: OleVariant; out RetValue: WordBool): HRESULT; stdcall;
    end;
    

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

    bAdded: WordBool;
    thingy: IThingy;
    hr: HRESULT;
    
    hr := thingy.AddSymbol('Seven', {out}bAdded);
    if Failed(hr) then
        OleError(hr);
    

    bAdded: WordBool;
    thingy: IThingy;
    hr: HRESULT;
    
    hr := thingy.AddSymbol('Seven', {out}bAdded);
    OleCheck(hr);
    

    bAdded: WordBool;
    thingy: IThingy;
    
    OleCheck(thingy.AddSymbol('Seven'), {out}bAdded);
    

    IThingy = interface
       ['{357D8D61-0504-446F-BE13-4A3BBE699B05}']
       function AddSymbol(ASymbol: OleVariant): WordBool); safecall;
    end;
    

    EOleSysError

    function AddSymbol(ASymbol: OleVariant): WordBool; safecall;
    var
       hr: HRESULT;
    begin
       hr := AddSymbol(ASymbol, {out}Result);
       OleCheck(hr);
    end;
    

    bAdded: WordBool;
    thingy: IThingy;
    
    bAdded := thingy.AddSymbol('Seven');
    

    function AddSymbol(ASymbol: OleVariant; out RetValue: WordBool): HRESULT; stdcall;
    function AddSymbol(ASymbol: OleVariant): WordBool; safecall;
    

    IThingy = interface
       ['{357D8D61-0504-446F-BE13-4A3BBE699B05}']
       function AddSymbol(ASymbol: OleVariant; out RetValue: WordBool): HRESULT; stdcall;
    end;
    
    IThingySC = interface
       ['{357D8D61-0504-446F-BE13-4A3BBE699B05}']
       function AddSymbol(ASymbol: OleVariant): WordBool); safecall;
    end;
    

      ITransaction = interface(IUnknown)
        ['{0FB15084-AF41-11CE-BD2B-204C4F4F5020}']
        function Commit(fRetaining: BOOL; grfTC: UINT; grfRM: UINT): HResult; stdcall;
        function Abort(pboidReason: PBOID; fRetaining: BOOL; fAsync: BOOL): HResult; stdcall;
        function GetTransactionInfo(out pinfo: XACTTRANSINFO): HResult; stdcall;
      end;
    
      { Safecall Version }
      ITransactionSC = interface(IUnknown)
        ['{0FB15084-AF41-11CE-BD2B-204C4F4F5020}']
        procedure Commit(fRetaining: BOOL; grfTC: UINT; grfRM: UINT); safecall;
        procedure Abort(pboidReason: PBOID; fRetaining: BOOL; fAsync: BOOL); safecall;
        procedure GetTransactionInfo(out pinfo: XACTTRANSINFO); safecall;
      end;
    

    //thingy: IThingy;
    thingy: IThingySC;
    

    thingy: IThingSC;
    bAdded: WordBool;
    
    thingy := CreateOleObject('Supercool.Thingy') as TThingySC;
    
    if Failed(IThingy(thingy).AddSymbol('Seven', {out}bAdded) then
    begin
       //Couldn't seven? No sixty-nine for you
       thingy.SubtractSymbol('Sixty-nine');
    end;
    

    [ComImport]
    [Guid("{357D8D61-0504-446F-BE13-4A3BBE699B05}")]
    [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    public interface IThingy
    {
       WordBool AddSymbol(OleVariant ASymbol);
       WordBool SubtractSymbol(OleVariant ASymbol);
    }
    

    [ComImport]
    [Guid("{357D8D61-0504-446F-BE13-4A3BBE699B05}")]
    [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    public interface IThingy
    {
       [PreserveSig]
       HRESULT AddSymbol(OleVariant ASymbol, out WordBool RetValue);
    
       WordBool SubtractSymbol(OleVariant ASymbol);
    }
    

    [PreserveSig]