Дублирующийся манифест вызывает «Не удается создать процесс»

#delphi #manifest

#delphi #манифест

Вопрос:

Я пытался получить обновление приложения, работающего с UAC, и после некоторых поисков мне нужно было включить манифест в мое приложение.

Вызывается манифест MyApp.manifest . Для того, чтобы включить это в проект, я создал RC-файл, который называется MyApp.rc . Это встроено в файл, вызываемый MyApp.rec командой предварительной сборки brcc32 $(PROJECTNAME).rc -fo$(PROJECTNAME).rec

Затем в моем DPR у меня есть

 {$R *.REC}
{$R *.RES}

begin
  Application.Initialize;
  

Это позволяет Delphi обрабатывать такие вещи, как информация о версии.

Все это отлично работает, когда приложение копируется в Windows 7.

Сегодня я пошел отлаживать приложение, и моя среда разработки — Windows XP, где я сразу получаю: Не удается создать процесс

После еще некоторого копания мне указали на редактор ресурсов XN. Который сразу же показал следующую проблему:

Дубликат манифеста

Первый из этих манифестов (тот, который отмечен 1) является MyApp.manifest (возможно, поэтому он нормально работает в Windows 7?) и, конечно же, если я удалю второй манифест, приложение будет работать отлично. Как ни странно, если я изменяю номер в RC-файле, номер 1 меняется вместе с ним, но второй манифест остается под номером 2.

Я думаю, что второй манифест может иметь какое-то отношение к темам среды выполнения, но отключение этого просто не работает (я снимаю флажок, закрываю параметры проекта, открываю параметры проекта, и флажок установлен).

итак, что вызывает появление второго манифеста? и как мне избавиться от этого?

Версия Delphi 2007

Комментарии:

1. MANIFEST_RESOURCE_ID из 2 обычно используется в DLL. Я сомневаюсь, что это поможет вам, но он не будет создан IDE Delphi. Просто найдите в своем проекте $ R, и вы должны его найти!

Ответ №1:

Если вы хотите использовать свой собственный манифест, вы должны отключить манифест, сгенерированный delphi, выполнив следующие действия, в зависимости от вашей версии delphi.

  1. Удалите любой TXPManifest компонент из вашего проекта
  2. Удалите все ссылки на модуль XPMan в вашем проекте
  3. Отключите опцию «Включить темы времени выполнения», присутствующую в project -> options -> application

Комментарии:

1. Я не могу отключить опцию «Включить темы времени выполнения». Он отказывается снимать галочку (я понятия не имею, почему)

2. когда вы говорите, ...I untick the checkbox, close project options, open project options and the checkbox is ticked возможно, это может быть вызвано каким-либо сторонним плагином в вашей ide, который включает эту опцию.

Ответ №2:

Какая версия Delphi? Проверьте предложение uses во всех файлах вашего проекта на UxTheme ; это старый менеджер тем от Майка Лишке из SoftGems, который был включен в VCL. Вы также можете поискать XPMan , который добавляет манифест в Delphi 7; он также от Mike. До включения в VCL у него была бесплатная ОС на его веб-сайте.

Вам также нужно будет выполнить проект-> Сборка, а не просто компиляцию впоследствии (или после изменения настройки «темы времени выполнения»), чтобы принудительно перекомпилировать все модули и полностью воссоздать исполняемый файл.

Комментарии:

1. Добавлена версия Delphi для вопроса. Приложение содержит только 1 форму, а форма содержит только 1 индикатор выполнения. Ни uxTheme, ни XPTheme нигде не включены в приложение (насколько я вижу)

2. Только что создал новое приложение VCL forms в D2007 и нажал на него кнопку. Запустил приложение, и кнопка была тематической. Использовал Project-> Options-> Compiler, снял галочки с тем времени выполнения, сохранил изменения и запустил приложение. Кнопка была нарисована без использования. Повторяя это с одним и тем же приложением (переключение опции, запуск, переключение опции, запуск), вы продолжаете изменять внешний вид кнопки каждый раз.

Ответ №3:

Я вернулся к этому проекту после того, как некоторое время поработал над чем-то другим, и удалил существующий файл .res перед открытием проекта

Я думаю, что Delphi кэширует файл projects .res в памяти и обновляет его только при компиляции / сборке, поскольку эта проблема полностью исчезла.