Дело сделано. Теперь вы решили две проблемы. Первый - ваш оригинальный, который должен идентифицировать, как был скомпилирован 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 в свойствах проекта «Тест», затем он устанавливается как «Тест». Что я делаю не так и как мне переписать то, что было введено вручную в свойствах проекта?

Ответы на вопрос(1)

Ваш ответ на вопрос