質問
私の作成の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 戻り値が自動的に変換されることができます。