Дело сделано. Теперь вы решили две проблемы. Первый - ваш оригинальный, который должен идентифицировать, как был скомпилирован EXE (без фактического запуска EXE). Во-вторых, вы, вероятно, не поняли, что введенная вами информация о версии была подвержена ошибкам ... теперь вы включили более автоматизированную информацию о версии.
жение My Delphi использует компилятор ресурсов Microsoft (rc.exe) для составления списка строк (текстовый формат в.rc
файл) вот так:
Language LANG_KOREAN, SUBLANG_KOREAN
STRINGTABLE
BEGIN
cszLanguageName "Korean"
<etc>
END
в.res
файл. Все таблицы содержат одинаковые идентификаторы (например,cszLanguageName
). Я поддерживаю два отдельных файла строки ресурса. Один содержит в основном европейские языки (английский, чешский и т. Д.), Которые я называю "Standard.rc". Другой называется 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 и связан с приложением, используя{$R 'source\Version.res'}
, Это компилируется, как и ожидалось, но когда я пытаюсь прочитатьInternalName
поле из EXE пустое. Если я вручную установитьInternalName
в свойствах проекта «Тест», затем он устанавливается как «Тест». Что я делаю не так и как мне переписать то, что было введено вручную в свойствах проекта?