Вопрос: Удалить {$ R * .res} в файле package.dpk удалит rccompile в файле .dproj


Я использую свой собственный .rc-файл для создания пользовательских записей ресурсов, включая информацию о версии.

Мой файл library.rc:

#include "app.rc.h"
VS_VERSION_INFO VERSIONINFO
FILEVERSION _FileVersion
PRODUCTVERSION _FileVersion
FILEFLAGSMASK VS_FFI_FILEFLAGSMASK
FILEFLAGS 0
FILEOS VOS__WINDOWS32
FILETYPE VFT_APP
FILESUBTYPE VFT2_UNKNOWN
BEGIN
  BLOCK "VarFileInfo"
  BEGIN
    VALUE "Translation", 0x0409, 1252
  END
  BLOCK "StringFileInfo"
  BEGIN
    BLOCK "040904E4"
    BEGIN
      VALUE "InternalName",       App_InternalName "\0"
      VALUE "CompanyName",        App_CompanyName "\0"
      VALUE "FileDescription",    App_ProductName "\0"
      VALUE "FileVersion",        _FileVersionStr "\0"
      VALUE "ProductName",        App_ProductName "\0"
      VALUE "ProductEdition",     App_ProductEdition "\0"
      VALUE "LegalCopyright",     "Copyright \251 " App_CompanyName "\0"
      VALUE "CompanyURL",         App_CompanyURL "\0"
      VALUE "ProductURL",         App_ProductURL "\0"
      VALUE "SupportURL",         App_SupportURL "\0"
      VALUE "AppRegistryPath",    App_RegistryPath "\0"
    END
  END
END

Я добавляю файл .rc в файл проекта пакета через Project | Добавить в проект. Мой файл package.dpk - это что-то вроде этого:

package SQL.Alpha.resource.core;

{$R *.res}
{$R 'library.res'}
{$ALIGN 8}

Файл package.dproj имеет запись RcCompile:

<RcCompile Include="..\..\build\rc\library.rc">
    <Form>library.res</Form>
</RcCompile>

Когда я скомпилирую пакет, все выглядит хорошо, но у него есть предупреждение:

[DCC Warning] W1056 Warning: Duplicate resource:  Type 16 (VERSIONINFO), ID 1; File library.res resource kept; file package.res resource discarded.

Это связано с тем, что сам пакет генерирует собственный файл package.res, который включает в себя записи MainIcon и VersionInfo. И VersionInfo имеет конфликт с моей собственной версией VersionInfo.

Затем я пытаюсь удалить {$ R * .res} в файле dpk:

package SQL.Alpha.resource.core;

{$R 'library.res'}
{$ALIGN 8}

Перестройте проект, и все будет хорошо. Предупреждение исчезло.

Однако есть некоторые побочные эффекты, удаляющие {$ R * .res} вручную:

  1. Delphi IDE снова добавит {$ R * .res}, если вы попытаетесь добавить новый блок в пакет или внести изменения и изменения в Project | Опции...
  2. Все записи RcCompile в файле .dproj будут удалены.

Я могу переносить с первым побочным эффектом, удалив {$ R * .res} снова в файле package.dpk.

Тем не менее, второй побочный эффект оказался вне моего контроля. Отсутствующий RcCompile в package.dproj приведет к тому, что файл rc не будет скомпилирован командой brcc32. Из-за этого удаление файлов .res в файловой системе приведет к ошибке в компиляции.

Кто-нибудь имеет идеи, как преодолеть эту проблему? Спасибо.


6


источник


Ответы:


В Delphi XE2 теперь вы можете удалить встроенную информацию о версии пакета Delphi (* .bpl) через Project | Опции. Перейдите к пакету «Информация о версии» и снимите флажок «Включить информацию о версии в проект».

Таким образом, встроенная информация о версии не будет генерироваться в файлах * .res, и поэтому предупреждение о компиляторе не будет отображаться. Вы можете использовать свои настроенные файлы * .rc как пожелаете.


5



У меня возникли проблемы с тем, чтобы это работало и, наконец, прибегло к использованию событий построения. Было бы неплохо просто включить rc-файл. Но если вы не получите другой ответ, который работает, вы можете добавить его к своему событию Pre-Build:

brcc32 "$ (PROJECTDIR) \ version.rc"

Затем просто включите файл скомпилированных файловых ресурсов с помощью {$ R version.res}. Вам не нужно добавлять файл .rc в проект.

Для конфликта VersionInfo рассмотрите опцию проекта для информации о версии. Существует флажок вверху для информации «Включить версию». Если вы снимете, что вы можете оставить {$ R * .res} на месте без конфликтов.


1