Проблемы с файлом манифеста приложения Delphi в WinXP и Win7 - PullRequest
5 голосов
/ 07 апреля 2010

Мой последний вопрос «Список служб и статусов служб в Win-7» заставил меня начать работу над решением, которое дает моему приложению привилегии администратора в Windows Vista и выше на основе файла .manifest.

Я былне уверен насчет продолжения предыдущего вопроса с этим вопросом, поскольку они не совпадают, поэтому вот еще один вопрос:

Мое приложение теперь отлично работает под Win 7, независимо от того, запускаю ли я его "как администратор" из-за манифестафайл.Мой файл манифеста выглядит следующим образом:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
 <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
  <assemblyIdentity version="1.6.0.5" processorArchitecture="X86" name="ServiceMonitorPro" type="win32"/>
  <description publisher="Powershield Ltd" product="Powershield Service Monitor">Powershield Service Monitor</description>
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
   <security>
    <requestedPrivileges>
     <requestedExecutionLevel level="requireAdministrator" uiAccess="false"/>
    </requestedPrivileges>
   </security>
  </trustInfo>
 </assembly>

Когда приложение работает на Windows 7 или Vista, UAC появляется с диалоговым окном, подобным этому: alt text http://www.freeimagehosting.net/uploads/39787fd3dd.jpg

Как я могу заменить«неизвестный» издатель?

Другая и самая большая проблема в том, что даже если приложение работает без проблем в Win7 или Vista, в WinXP оно теперь вылетает с сообщением: «Это приложение не запустилось, потому чтонеправильная конфигурация приложения. Переустановка приложения может решить эту проблему. "

Еще одна вещь, которую я хотел бы добавить: если я добавлю ссылку (использует предложение) в XPMan, приложение отлично работает на WinXP, но затемэто мой .manifest файл не имеет никакого значения под Vista или Win7.

Ответы [ 4 ]

12 голосов
/ 07 апреля 2010

Я должен поблагодарить всех, что с комментариями или ответами указывает мне продолжать копать ... :) Я пошел искать файл WindowsXP.res. Содержимое этого файла:

<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
  <assemblyIdentity
    type="win32"
    name="DelphiApplication"
    version="1.0.0.0" 
    processorArchitecture="*"/>
  <dependency>
    <dependentAssembly>
      <assemblyIdentity
        type="win32"
        name="Microsoft.Windows.Common-Controls"
        version="6.0.0.0"
        publicKeyToken="6595b64144ccf1df"
        language="*"
        processorArchitecture="*"/>
    </dependentAssembly>
  </dependency>
</assembly>

Решение: Я смешал свой файл .manifest с файлом WindowsXP.Res xml, добавив раздел зависимость . Если кто-нибудь знает, почему он сейчас работает, я был бы рад услышать - но это было здесь решение - протестировано до сих пор на нескольких виртуальных машинах, на моем компьютере и нескольких других ... работающих :)

8 голосов
/ 07 апреля 2010

Вам необходимо подписать свой код сертификатом подписи кода. Здесь должно быть много примеров. Я пометил ваш вопрос как «подпись кода», и вы также можете найти «сертификат».
Я сам использую сертификаты Comodo и подписываю их с помощью замечательного замечательного Visual Build Pro v6, который является рекламодателем на SO.

3 голосов
/ 07 апреля 2010

Вы также можете указать совместимость с различными версиями Windows в своем манифесте. Я знаю, что есть записи для совместимости с Vista и Win7; не уверен насчет XP.

Информация о разделе совместимости манифеста доступна по адресу MSDN . Это может также помочь - со связанной страницы:

<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
<application>
<!--The ID below indicates application support for Windows Vista -->
<supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/>
<!--The ID below indicates application support for Windows 7 -->
<supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
</application>
</compatibility>
1 голос
/ 16 ноября 2011

В более новых версиях Delphi (я думаю, что 7 и выше) вам также нужно обязательно снять флажок «Использовать темы времени выполнения» в диалоговом окне параметров проекта, в противном случае Delphi автоматически создаст ссылку в своем собственном файле манифеста по умолчанию (этокак он включает «поддержку тем»), и вы получите ошибку времени выполнения из-за неправильной конфигурации приложения, потому что будут конфликтующие записи.

Вот полный файл манифеста для приложения Delphi2007, которое необходимо запустить вРежим администратора в Windows 7, а также включает раздел «зависимости» для включения поддержки тем во время выполнения:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
      <assemblyIdentity
        type="win32"
        name="CodeGear RAD Studio"
        version="11.0.2902.10471" 
        processorArchitecture="*"/>
      <dependency>
        <dependentAssembly>
          <assemblyIdentity
            type="win32"
            name="Microsoft.Windows.Common-Controls"
            version="6.0.0.0"
            publicKeyToken="6595b64144ccf1df"
            language="*"
            processorArchitecture="*"/>
        </dependentAssembly>
      </dependency>
      <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
        <security>
          <requestedPrivileges>
            <requestedExecutionLevel
              level="requireAdministrator"
              uiAccess="false"/>
            </requestedPrivileges>
        </security>
      </trustInfo>
    </assembly>
...