質問

私の作成のActiveX EXEを使用VB6、唯一の例はすべて書をご利用いただけます:standardとexpress。

の読み込みのコード例は、私がその機能をその署名の後に safecall キーワードとなります。次に例を示します。

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

何の目的でこのキーワード?

役に立ちましたか?

解決

Safecallパスのパラメータは右から左の代わりに、パスカルまたは登録(デフォルトの)左から右に

とsafecallの手順または関数を削除しパラメータスタックから帰(パスカルはそれほど上がらないcdecl場での呼び出し側)

Safecallを実装しな例外'ファイアウォール';espにWin32この実装プロセス間COMエラー通知です。いなと一致するstdcall(その他の呼び出し規約で使用のapi)

他のヒント

また、例外ファイアウォール作業を呼び出しSetErrorInfo()オブジェクトを支援するIErrorInfoの呼び出し側で拡張に関する情報は例外です。このTObject.SafeCallExceptionオーバーライドの両方TComObjectとTAutoIntfObject.いずれの種類についても実施しISupportErrorInfoにこのマークであること。

のイベントの例外は、safecallのメソッドの呼び出し元でクエリーのためのISupportErrorInfo、そのクエリがインターフェース用のメソッドが失敗HRESULT(高ビットセットが返すS_OK, GetErrorInfo() では、例外情報(内容、等 のIErrorInfo実施いた SetErrorInfo() によるポRTLのSafeCallExceptionオーバーライド).

どのフランソワ氏 ればなsafecallおCOMのメソッドの呼び出していた以下のようにという独自のエラーチェックの代わりに得ることができます。

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

COM、メソッドは機能を返します。 HRESULT:

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

これは絶対的なルールCOM:

  • も例外ではありませんCOM
  • ものを返しますHRESULT
  • 負HRESULTことに失敗
  • 高レベルの言語が失敗してマップされる例外

そのつもりでしたのはデザイナーにおいて、より高レベルの言語でも自動的に翻訳 失敗した 方法を例外です。

そこで日本語COMの呼び出しできなく表現され、HRESULT.E.g.:

  • デ様: function AddSymbol(ASymbol: OleVariant): WordBool;
  • C#様: WordBool AddSymbol(OleVariant ASymbol);

トを利用できる機能原署名:

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

を取り扱い上げの例外は自分自身

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);

COM思いまへの対応HRESULTs

できDelphiを隠する配管から離さないというのが当たり前で、プログラミング:

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

裏にコンパイラは、まだチェックを返しHRESULT、スローする EOleSysError 例外の場合はHRESULT示不全(すなわちした。のコンパイラ生成 safecall 版は、機能的には次と同等です:

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');

tl;dr:どちらかをお使いいただけます:

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

しかし、前者が必要ですのHRESULTsます。

ボーナスChatter

ほとんどないのHRESULTs自分;でcluttersのプログラムとノイズを追加する。もうチェックしたいのHRESULT自例たいへの対応の失敗はない例外).いバージョンとインターネットで提供して起動付属の翻訳Windowsのヘッダーのインターフェースの宣言された方

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;

またはからRTLソース:

  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;

SC 接尾辞立 safecall.両方のインタフェースは相当きを行うことを目的としています。を宣言するのにビルトインデータベース変数によってはご希望の:

//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;

ましゃべり-C#

C#デフォルトでは、同等のインターネットで提供 safecall, を除き、クライアントまで、フルのC#:

  • きのオプトアウトのsafecallマッピング
  • よりオプトイン

クライアントまで、フルのC#きを宣言するのにビルトインデータベースをインターフェース:

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

することCOM HRESULT を表示します。のC#コンパイラのように、Delphiコンパイラは、自動的にチェックを返HRESULT、例外がスローされます。

およびクライアントまで、フルのC#としてインを選択できますのHRESULTs自分自身

[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] このコンパイラの保存方法に署名としては:

るかどうかを示しますポ方法として HRESULT または retval 戻り値は、いくつかを直接翻訳かどうか HRESULT または retval 戻り値が自動的に変換されることができます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top