リソース DLL の使用

提供: RAD Studio
移動先: 案内検索

国際化対応アプリケーションの作成:インデックス への移動


作成したアプリケーションを構成する実行可能ファイル、DLL、およびパッケージ(.bpl ファイル)には、必要なリソースがすべて含まれています。しかし、実行可能ファイルや DLL やパッケージ ファイルと同じ名前のローカライズ済みリソース DLL をアプリケーションに同梱するだけで、これらのリソースをローカライズ版に置き換えることができます。

アプリケーション起動時には、ローカル システムのロケールが確認されます。使用している EXE、DLL、または BPL ファイルと同じ名前のリソース DLL が見つかると、その DLL の拡張子が調べられます。リソース モジュールの拡張子がシステム ロケールの言語および国と一致すると、アプリケーションでは、実行可能ファイルや DLL やパッケージのリソースではなく、そのリソース モジュールのリソースが使われます。言語と国の両方に一致するリソース モジュールがなければ、アプリケーションは言語だけに一致するリソース モジュールを探します。言語に一致するリソース モジュールもない場合には、実行可能ファイルや DLL やパッケージと一緒にコンパイルされたリソースが使われます。

ローカル システムのロケールと一致するリソース モジュール以外をアプリケーションで使用したい場合には、Windows レジストリに "ロケール オーバーライド" エントリを設定することができます。HKEY_CURRENT_USER\Software\Embarcadero\Locales キーの下で、[新規|文字列値]コマンドを選択して新しいキーを追加します。[名前]の列にアプリケーションのパスと実行可能ファイル名を文字列値として入力し、[データ]の値に希望するリソース DLL の拡張子を入力します。アプリケーションの起動時には、システム ロケールの前に、この拡張子を持つリソース DLL の検索が行われます。このレジストリ エントリを設定することで、システムのロケールを変更しなくても、ローカライズ版のアプリケーションをテストできます ("ロケール オーバーライド" レジストリ キーの使用法の詳細は、「アプリケーションのローカライズ」および「ローカライズ済みアプリケーションの配置」を参照)。

たとえば、インストール プログラムまたはセットアップ プログラムで次の手続きを使用すると、アプリケーションの読み込み時に使用するロケールを示すレジストリ キーの値を設定できます。

 procedure SetLocaleOverride(const FileName, LocaleOverride: string);
 var
   Reg: TRegistry;
 begin
   Reg := TRegistry.Create;
   try
     if Reg.OpenKey('Software\Embarcadero\Locales', True) then
       Reg.WriteString(FileName, LocaleOverride);
   finally
     Reg.Free;
   end;
 end;
 void SetLocalOverrides(char* FileName, char* LocaleOverride) {
 	HKEY Key;
 	const char* LocaleOverrideKey = "Software\\Embarcadero\\Locales";
 	if (RegOpenKeyEx(HKEY_CURRENT_USER, LocaleOverrideKey, 0, KEY_ALL_ACCESS,
 		&Key) == ERROR_SUCCESS) {
 		if (lstrlen(LocaleOverride) == 3)
 			RegSetValueEx(Key, FileName, 0, REG_SZ,
 			(const BYTE*)LocaleOverride, 4);
 		RegCloseKey(Key);
 	}
 }

アプリケーション内では、グローバル関数 System.FindResourceHInstance を使用して、現在のリソース モジュールのハンドルを取得できます。次に示すのはその例です。

 LoadStr(FindResourceHInstance(HInstance),
  IDS_AmountDueName, szQuery, SizeOf(szQuery));
 
  LoadString(FindResourceHInstance(HInstance),
   IDS_AmountDueName, szQuery, sizeof(szQuery));
 LoadString(FindResourceHInstance(HInstance), IDS_AmountDueName, szQuery, sizeof(szQuery));

適切なリソース DLL を提供するだけで、1 つのアプリケーションを出荷し、実行されるシステムのロケールにそれを自動的に適合させることが可能になります。

関連項目