私の Delphi アプリケーションは、Microsoft Resource Compiler (rc.exe) を使用して、次の.rc
ように文字列のリスト (ファイル内のテキスト形式) をコンパイルします。
Language LANG_KOREAN, SUBLANG_KOREAN
STRINGTABLE
BEGIN
cszLanguageName "Korean"
<etc>
END
.res
ファイルに。すべてのテーブルに同じ ID ( などcszLanguageName
) が含まれています。2 つの個別のリソース文字列ファイルを維持しています。1 つは主にヨーロッパ言語 (英語、チェコ語など) を含み、これを "Standard.rc" と呼んでいます。もう 1 つは「Alternate.rc」と呼ばれ、韓国語、タイ語などの他のすべての言語が含まれています。
コンパイル時のスイッチは、EXE にリンクされるファイルを決定します。
{$IFDEF ALT_LANG}
{$R 'source\Alternate.res'}
{$ELSE}
{$R 'source\Standard.res'}
{$ENDIF}
それが背景でした。では質問に移りましょう。
EXE へのパスが与えられ、WindowsGetFileVersionInfo
メソッドのようなものを使用して、どの STRINGTABLE リソースが EXE にあるかを判断することは可能ですか? 次のことを判断できた場合:
Language LANG_KOREAN, SUBLANG_KOREAN
また
Language LANG_CZECH, SUBLANG_DEFAULT
が含まれている場合、EXE は「標準」または「代替」として識別できます。
現在、EXE を実際に実行しなくても、唯一の違いはバイト単位のサイズであり、信頼性の低いヒューリスティックです。C++ または C# で問題ありません。Delphi に適応したり、Delphi から呼び出される別のユーティリティを作成したりできます。
アップデート
LU RD からのコメントに基づいて、次の Version.rc ファイルを作成しました。
// Version information resource file
VS_VERSION_INFO VERSIONINFO
BEGIN
BLOCK "StringFileInfo"
BEGIN
BLOCK "080904b0"
BEGIN
VALUE "InternalName", "Standard"
END
END
END
次に、これを (Microsoft Resource Compiler を使用して) Version.res にコンパイルし、.xml を使用してアプリケーションにリンクしました{$R 'source\Version.res'}
。これは期待どおりにコンパイルされますが、EXE からフィールドを読み取ろうとするInternalName
と空白になります。プロジェクトのプロパティを手動でInternalName
「テスト」に設定すると、「テスト」として設定されます。プロジェクトのプロパティに手動で入力した内容を上書きするにはどうすればよいですか?