Изменение файла манифеста UAC, хранящегося как ресурс Delphi

Я хочу, чтобы моя программа просто запрашивала привилегии при запуске, и для этого я добавляю файл манифеста в исходный код Delphi в качестве ресурса. Это содержимое файлов XML:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
  <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
    <assemblyIdentity version="1.1.1.1"
      processorArchitecture="X86"
      name="YourApplicationExeName"
      type="win32"/>
    <description>elevate execution level</description>
    <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
      <security>
        <requestedPrivileges>
          <requestedExecutionLevel level="requireAdministrator" uiAccess="false"/>
        </requestedPrivileges>
      </security>
    </trustInfo>
  </assembly>

Мне нужно изменить файл, в котором указано «YourApplicationExeName», и добавить текущее имя .exe, поскольку пользователь может переименовать файл .exe в любое время.

Я хочу знать: когда пользователь открывает исполняемый файл, как мне добавить новое имя исполняемого файла в файл манифеста, хранящийся как ресурс? Я знаю, как получить новое имя файла, я просто хочу знать, как мне обновить файл ресурсов с новым именем файла?


person ddvniek    schedule 06.07.2014    source источник
comment
Не дубликат. Мой вопрос заключается в том, как изменить файл XML - добавить текущее имя приложения - и добавить его в качестве файла ресурсов для повторного использования?   -  person ddvniek    schedule 06.07.2014
comment
Вы изменяете файл точно так же, как и любой другой файл. Базовым условием программирования является то, что вы знаете, как редактировать текстовый файл. Если вы не знаете, как редактировать текстовый файл, вам нужно вернуться к началу. Если вы хотите знать, как добраться из того места, где вы находитесь сейчас, туда, где вы хотите быть, вам нужно будет подробно объяснить, что вы сделали в настоящее время, то есть где вы сейчас находитесь. Мы не можем читать ваши мысли. Пожалуйста, отредактируйте вопрос и приложите немного больше усилий для объяснения.   -  person David Heffernan    schedule 06.07.2014
comment
Все, что вам нужно сделать, это начать с любого учебника о том, как скомпилировать и добавить ресурс манифеста. Они все одинаковые. Вы можете найти исправные в этом вопросе. 1. Создайте файл XML. 2. Создайте файл .rc. 3. Скомпилируйте файл .rc в файл .res. 4. Свяжите файл .res. Шаги 3/4 можно объединить в один, если хотите, с расширенной опцией $R. Нам просто не нужен еще один вопрос о том, как мне скомпилировать и связать здесь ресурсный вопрос. Их уже буквально тысячи.   -  person David Heffernan    schedule 06.07.2014
comment
Привет Дэвид. Я знаю, как редактировать текстовый файл, и я знаю, как скомпилировать файл .rc и добавить его в исходный код проекта. Не проблема. Проблема, с которой я сталкиваюсь, заключается в обновлении файла ресурсов. Редактирование файла XML с новыми значениями, а затем снова добавление себя в качестве ресурса. Я хочу, чтобы когда пользователь открывает исполняемый файл, он должен определить новое имя файла (не проблема) и добавить новое имя файла в файл манифеста (хранящийся как ресурс)   -  person ddvniek    schedule 06.07.2014
comment
Что ты имеешь в виду? Открыть исполняемый файл? Вы имеете в виду создать новый процесс и выполнить его? Пожалуйста, объясните, что именно вы имеете в виду в вопросе. Нажмите кнопку редактирования и уточните.   -  person David Heffernan    schedule 06.07.2014
comment
Отредактировано. Я надеюсь, что это проясняет то, что я пытаюсь спросить. Все, что я хочу, это когда файл .exe открыт, он должен определить свое собственное имя файла и добавить его в манифест (XML-файл), который хранится в проекте в качестве ресурса.   -  person ddvniek    schedule 06.07.2014


Ответы (2)


То, о чем вы просите, невозможно. Процесс запускается из исполняемого файла. Этот файл заблокирован во время выполнения процесса и не может быть изменен.

Если вы хотите изменить ресурс в скомпилированном исполняемом файле, используйте UpdateResource API. Но для этого файл не должен быть заблокирован. Вам нужно будет сделать это из другого процесса.

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

документация описывает это поле следующим образом:

Уникальное имя приложения или сборки. Используйте следующий формат имени: Organization.Division.Name. Например, Microsoft.Windows.mysampleApp.

Подводя итог, я думаю, что вы были введены в заблуждение тем, кто написал YourApplicationExeName. Вы просто не должны пытаться модифицировать этот ресурс после компиляции программы. Вы должны правильно установить поле при компиляции вашего приложения, и все.

person David Heffernan    schedule 06.07.2014
comment
Спасибо за ответ. Другими словами, если бы я хотел обновить ресурс исполняемого файла, это должен был бы сделать другой исполняемый файл, поскольку первый исполняемый файл не может быть запущен. Также в поле YourApplicationExeName нужно не имя файла исполняемого файла, а имя приложения? - person ddvniek; 06.07.2014
comment
Правильно по обоим пунктам. Вы абсолютно не хотите изменять исполняемый файл таким образом. Ни одна программа, с которой я когда-либо сталкивался, не делает этого. - person David Heffernan; 06.07.2014

Скажите Delphi, чтобы он не включал манифест сборки в ваш исполняемый файл, а вместо этого использовал внешний манифест.

Например:

Contoso.exe
Contoso.exe.manifest

Файл .manifest — это просто файл XML. Когда пользователь переименовывает Contoso.exe в Frobber.exe, вы можете:

  • скажите им также переименовать Contoso.exe.manifest в Frobber.exe.manifest
  • перед запуском Frobber.exe извергнуть для них файл Frobber.exe.manifest на жесткий диск
person Ian Boyd    schedule 01.08.2014