今回はサービスの使い方について説明をする。
前回のコンポーネントとの違いは、サービスはプロセスの中でただ1つのインスタンスを持つ点だ。
ファイル関連で例に挙げると、 nsIFile
は個別のファイルを操作するコンポーネントでファイルごとに違ったインスタンスを持つ必要があるが、
nsIDirectoryService
は特殊ディレクトリの位置を得るサービスで、得られる情報はプロセスを通じて共通である。
この nsIDirectoryService
を取得するコードは次のようになる。
var
dirSrv: nsIDirectoryService;
begin
NS_GetService('@mozilla.org/file/directory-service;1', nsIDirectoryService, dirSrv);
end;
この NS_GetService
関数のプロトタイプ宣言は以下のようになる。
function NS_GetService(const CID, IID: TGUID; out Intf): Longword; overload;
function NS_GetService(ContractID: PAnsiChar; const IID: TGUID; out Intf): Longword; overload;
引数は NS_CreateInstance
関数と同じなので、取り立てて説明することもないだろう。
サービスとコンポーネントの区別は、 ContractID やインターフェース名の末尾に 'Service' とついているかどうかでおこなう。
余談だが、ディレクトリサービスは今回のように nsIDirectoryService
を使うことはまれで、 nsIProperties
で取得するのが一般的である。
ほかにも多くのサービスが nsIProperties
によるインスタンスの取得を許可しているようだ。
Hello!
I am trying to use your GeckoSDK in Delphi. But I get nil in "FBrowser" and "dirSrv" whenever I call these functions:
GRE_Startup;
NS_CreateInstance(NS_WEBBROWSER_CONTRACTID, nsIWebBrowser, FBrowser);
NS_GetService('@mozilla.org/file/directory-service;1', nsIDirectoryService, dirSrv);
Can you please help me? Arigato Gozaimasu
Thank you for using.
How about the result value of GRE_Startup function?
If the function returns a fault value, the SDK could not load Gecko.
You must do one of the followings:
1. Put your program on the directory of Mozilla or Seamonkey. (not Firefox or Thunderbird!)
2. Add the directory of Mozilla or Seamonkey to PATH.
3. Install GRE.
And thank you. See you.