Gecko SDK for Delphi の使い方 コンポーネント編

| コメント(0) | トラックバック(0)

前回は GRE の初期化だけで説明が終わったので、今回は XPCOM のコンポーネントの作成方法、使用方法について。 次のコードでは nsILocalFile インターフェースのインスタンスを作成する。

program GeckoTest002;
uses nsXPCOM, nsXPCOMGlue;
var
  localFile: nsILocalFile;
begin
  GRE_Startup;
  NS_CreateInstance('@mozilla.org/file/local;1', nsILocalFile, localFile);
  localFile := nil;
  GRE_Shutdown;
end.

このコードでは NS_CreateInstance 関数を使って XPCOM のコンポーネントを作成している。 この関数は C++ 版での do_CreateInstance に相当する。 プロトタイプ宣言は次のとおり。

function NS_CreateInstance(const ContractID: PAnsiChar; const IID: TGUID; out Intf): nsresult; overload;
function NS_CreateInstance(const CID: TGUID; const IID: TGUID; out Intf): nsresult; overload;

1番目の引数はコンポーネントの種類を指定する。 文字列を使う方法と GUID を使う方法の2通りあるが、今回は文字列を使った。

2番目の引数はインターフェースの型を指定する。 本来ならば GUID を指定するのだが、 Delphi では interface 型を指定するとその GUID を指定したことと同じになるのだ。 今回は nsILocalFile 型を指定したが、継承元である nsIFile 型を指定することも可能だし、コンポーネントによっては継承関係でない型を指定することもできる。

インスタンスの作成が成功したら3番目の引数にインスタンスが代入される。 成功したかどうかは戻り値を調べることでわかる。

今回は何もしていないけど使い終わったら必ず解放する必要がある。 Delphi の interface 型はスコープを抜けると自動的に解放されるのだが、今回の例ではスコープを抜ける前に GRE_Shutdown があるので、その前に nil を代入して解放する。 Delphi を開発環境として選んだ理由はコレで、IInterface 互換のインターフェースならば余計なコードをほとんど追加せずに使うことができる。 ちなみに Linux 版(というか Windows 以外)の XPCOM のコードはメソッドの呼び出しがすべて cdecl 規約になっていて IInterface 互換ではないためそのままでは Delphi/Kylix で使えない(RTL のコードを書き換えれば可能かもしれない)。

コンポーネントの作成についてはここまで。

トラックバック(0)

トラックバックURL: http://nesitive.net/mt/tbping/4

コメントする

このブログ記事について

このページは、necottieがOctober 22, 2004 11:43 PMに書いたブログ記事です。

ひとつ前のブログ記事は「Gecko SDK for Delphi の使い方 初期化編」です。

次のブログ記事は「Gecko SDK for Delphi の使い方 サービス編」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。