既存の PRI ファイルと互換性のある PRI ファイルを作成できるリソース インデクサーを作成します。 この関数は、非常に限られたシナリオでのみ必要です。詳細については 、「解説 」を参照してください。
この関数を使用する前に、COM を初期化する必要があります ( CoInitializeEx を呼び出すなど)。
構文
HRESULT HRESULT MrmCreateResourceIndexerFromPreviousSchemaFile(
_In_ PCWSTR projectRoot,
_In_ MrmPlatformVersion platformVersion,
_In_opt_ PCWSTR defaultQualifiers,
_In_ PCWSTR schemaFile,
_Inout_ MrmResourceIndexerHandle *indexer
);
パラメーター
-
projectRoot [in]
-
型: PCWSTR
一部のファイル パスの計算元となるルート ディレクトリ。 通常、これはソース プロジェクトのルート ディレクトリですが、異なる場合があります。 詳細については、 MRM のファイル リソース を参照してください。
-
platformVersion [in]
-
生成された構成ファイルに使用するプラットフォーム バージョン (targetOsVersion)。 ほとんどの呼び出し元は、MrmPlatformVersion_Windows10_0_0_5を使用する必要があります
-
defaultQualifiers [in, optional]
-
型: PCWSTR
既定のリソース修飾子の一覧。 たとえば、"language-en-US_scale-100" などです。 修飾子の詳細については、 MRM の修飾子を参照してください。
-
schemaFile [in]
-
型: PCWSTR
スキーマが一致する必要がある既存の PRI ファイルへのパス、または一致する PRI ファイルのスキーマを含む XML ダンプへのパス。 XML ダンプの作成については、 MrmDumpPriFile を参照してください。
-
インデクサー [in, out]
-
リソース インデクサー ハンドルへのポインター。 正常に戻ると、リソース インデクサーへのハンドルが含まれます。 使用後、 MrmDestroyIndexerAndMessages を使用してインデクサーを解放する必要があります。
値を返す
型: HRESULT
関数が成功した場合はS_OKし、それ以外の場合は他の値を指定します。 成功または失敗を判断するには、 SUCCEEDED マクロまたは FAILED マクロ (winerror.h で定義) を使用します。
注釈
この関数は MrmCreateResourceIndexer と同じですが、インデクサーでは、インデクサーに追加された新しいリソースに加えて、指定された schemaFile のすべてのリソース名とインデックスを含める PRI ファイルが作成されます。 これにより、一部のリソースが省略されている場合でも、新しい PRI ファイルは元の schemaFile と "スキーマ互換" になります。
ほとんどの一般的なシナリオでは、この関数は必要ありません。 次のいずれかが該当する場合は、スキーマと互換性のある PRI ファイルのビルドについて心配する必要はありません。
- 1 つのスタンドアロン PRI ファイルを使用します (パッケージ化されていないアプリでサポートされている唯一のオプションです)。 または
- メイン PRI をリビルドするときは、常にリソース パックの PRI を再構築します。
この関数は、非常に限られたシナリオでのみ必要です。つまり、次のようになります。
- メイン PRI ファイルと 1 つ以上のリソース パック PRI ファイルがあります。 そして
- メイン PRI ファイルを再構築しています (ただし、リソース パック PRI ファイルは再構築しません)。 そして
- メイン PRI ファイルから 1 つ以上のリソースを削除している (または削除されている可能性があります)。
このような状況では、 schemaFile 参照を元のメイン PRI ファイルに設定すると、削除されたリソースのプレースホルダー インデックス値があることを確認することで、新しいメイン PRI ファイルと既存のリソース パックとの互換性が確保されます。
注: 新しい PRI ファイルには、元のファイルのすべてのリソース名 (およびインデックス) が含まれますが、インデクサーに明示的に追加されたリソースの値のみが含まれます。 新しいファイル は、 元の PRI ファイルから値を継承 (コピー) しません。
例
PRI ファイル "original.pri" に英語用の 3 つのリソースが含まれているとします。
| 名前 | Index | 価値 |
|---|---|---|
| ms-resource:///strings/test | 0 | "TestValue" |
| ms-resource:///strings/save | 1 | "保存" |
| ms-resource:///strings/delete | 2 | "削除" |
次のコード スニペットを検討します (エラー チェックは省略されています)。
// Create an indexer with the existing schema
MrmResourceIndexerHandle indexer{};
MrmCreateResourceIndexerFromPreviousSchemaFile(L"C:\\MyProject", MrmPlatformVersion_Windows10_0_0_5, L"language-en", L"original.pri", &indexer);
// Add values for "save" and "delete".
// Note that there is no "test" resource added, since we don't need it anymore.
MrmIndexString(indexer, L"ms-resource:///strings/save", L"Save", L"language-en");
MrmIndexString(indexer, L"ms-resource:///strings/delete", L"Delete", L"language-en");
// Save the file
MrmCreateResourceFile(indexer, MrmPackagingModeStandaloneFile, MrmPackagingOptionsNone, L"C:\\");
新しいリソース ファイルには、英語用の次のものが含まれます。
| 名前 | Index | 価値 |
|---|---|---|
| ms-resource:///strings/test | 0 | <なし> |
| ms-resource:///strings/save | 1 | "保存" |
| ms-resource:///strings/delete | 2 | "削除" |
これにより、 save と delete のリソース インデックスが同じ (それぞれ 1 と 2) 維持されるため、ローカライズされたバージョンの "保存" と "削除" を含むリソース パックが一致します。 アプリケーション コードが test リソースを読み込もうとした場合、候補が定義されていないため、実行時 (少なくとも英語) で失敗します。
これが重要な理由を示すために、基本スキーマで新しい PRI ファイルが作成されていない場合の動作を見てみましょう。 その場合、新しい PRI ファイルには次のものが含まれます。
| 名前 | Index | 価値 |
|---|---|---|
| ms-resource:///strings/save | 0 | "保存" |
| ms-resource:///strings/delete | 1 | "削除" |
delete (インデックス 1) の検索を再取得すると、正しい文字列 "Delete" が英語で取得されますが、他の言語ではローカライズされたバージョンの "Save" が取得されます (インデックス 1 は以前は save リソースのインデックスでした)。 これにより、ユーザーは実際に削除操作を実行した "保存" というラベルが付いた UX が (ローカル言語で) 表示されます。これは重大なバグです。
必要条件
| Requirement | 価値 |
|---|---|
| サポートされる最小クライアント |
Windows 10バージョン 1803 [デスクトップ アプリのみ] |
| サポートされている最小のサーバー |
Windows Server [デスクトップ アプリのみ] |
| ヘッダー |
|
| 図書館 |
|
| DLL |
|