前回は 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 のコードを書き換えれば可能かもしれない)。
コンポーネントの作成についてはここまで。
コメントする