В статье будет рассмотрена проблема искажения данных в метаданных EXE файлов, возникающая при использовании внешнего файла verinfo.rc для генерации информации о скомпилированном EXE файле в среде разработки Delphi. Проблема заключается в том, что при просмотре деталей скомпилированного EXE файла в Проводнике Windows, некоторые данные могут быть искажены, и вместо ожидаемого текста могут отображаться странные символы. Это может быть вызвано неправильным форматированием строк в ресурсе версии.
Оригинальный заголовок:
Ошибки в МETA-данных EXE: Искажение данных и их устранение в Delphi
Описание проблемы (вопрос):
Разработчики, использующие внешний файл verinfo.rc для создания метаданных EXE файла, сталкиваются с проблемой искажения данных. В файле verinfo.rc используются различные блоки и значения для хранения информации о файле, такой как описание файла, компания-разработчик, название продукта и т.д. Пример содержимого файла verinfo.rc:
VS_VERSION_INFO VERSIONINFO
FILEVERSION 1,0,0,0
PRODUCTVERSION 1,0,0,0
BEGIN
BLOCK "StringFileInfo"
BEGIN
BLOCK "040904b0"
BEGIN
VALUE "Comments", "Company Soft"
VALUE "CompanyName", "Company2"
VALUE "FileDescription", "Company Soft"
VALUE "FileVersion", "x.x.x.x"
VALUE "InternalName", "Company Soft"
VALUE "LegalCopyright", "Company2"
VALUE "OriginalFilename", "abrev.exe"
VALUE "ProductName", "Company Soft"
VALUE "ProductVersion", "x.x.x.x"
END
END
BLOCK "VarFileInfo"
BEGIN
VALUE "Translation", 0x0409,1200
END
END
При просмотре деталей скомпилированного EXE файла в Проводнике Windows, пользователь может заметить, что некоторые данные искажены, и вместо корректных текстов отображаются нечитаемые символы. Это может быть связано с неправильным форматированием строк в ресурсах.
Альтернативный ответ и устранение проблемы
Один из способов устранения ошибки заключается в добавлении нулевого терминатора (\0) в конце каждой строки. Это стандартная практика при работе с строками в ресурсах. Пример исправленного файла verinfo.rc:
VS_VERSION_INFO VERSIONINFO
FILEVERSION 1,0,0,0
PRODUCTVERSION 1,0,0,0
BEGIN
BLOCK "StringFileInfo"
BEGIN
BLOCK "040904b0"
BEGIN
VALUE "Comments", "Company Soft\0"
VALUE "CompanyName", "Company2\0"
VALUE "FileDescription", "Company Soft\0"
VALUE "FileVersion", "x.x.x.x\0"
VALUE "InternalName", "Company Soft\0"
VALUE "LegalCopyright", "Company2\0"
VALUE "OriginalFilename", "abrev.exe\0"
VALUE "ProductName", "Company Soft\0"
VALUE "ProductVersion", "x.x.x.x\0"
END
END
BLOCK "VarFileInfo"
BEGIN
VALUE "Translation", 0x0409,1200
END
END
Документация по ресурсу версии также рекомендует использовать нулевой терминатор для всех частей данных. Например:
#define VER_FILEVERSION_STR "3.10.349.0\0"
...
VALUE "FileVersion", VER_FILEVERSION_STR
Также важно отметить, что в среде Delphi можно использовать фигурные скобки для обозначения блоков вместо ключевых слов, что может упростить чтение и написание ресурсов версии.
FILETYPE 0x1 {
BLOCK "StringFileInfo" {
BLOCK "00000000" {
VALUE "FileDescription", "Great product, much value!\000"
VALUE "FileVersion", "1.0.39\000"
}
}
BLOCK "VarFileInfo" {
VALUE "Translation", 0x0000 0x0000
}
}
При просмотре скомпилированного файла ресурсов в бинарном формате, можно заметить, что тексты не имеют префиксов, указывающих на длину, что также является причиной необходимости использования нулевого терминатора.
Подтвержденный ответ и вывод
Использование нулевого терминатора (\0) в конце каждой строки данных в ресурсе версии является обязательным. Это позволяет корректно интерпретировать строки в бинарном формате и предотвращает искажение данных при просмотре метаданных EXE файла в Проводнике Windows.
Заключение
Разработчикам, работающим с метаданными EXE файлов в Delphi, важно помнить о правилах форматирования строк в ресурсах версии. Добавление нулевого терминатора в конец каждой строки данных является ключевым моментом для предотвращения искажения текста. Следуя этим рекомендациям, можно избежать распространенных ошибок и обеспечить корректное отображение информации о программе в системе.
Проблема описана в статье связана с искажением данных метаданных EXE файлов при использовании внешнего файла `verinfo.rc` в среде разработки Delphi, из-за чего в Проводнике Windows отображаются неправильные символы вместо ожидаемого текста, что может быт
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS