Как создать файл манифеста в Visual Basic 6.0?
Я хочу создать файл манифеста в VB 6.0. Когда я запускаю свое приложение, ОС должна запросить у пользователя права администратора. Я тоже хочу узнать, как это можно встроить в приложение?
2 ответа
Вы на самом деле не создаете файл манифеста в VB. Манифест приложения Windows - это стандартный текстовый документ в формате XML. Вы можете создать его в Блокноте и сохранить с соответствующим именем файла в каталоге вашего приложения (YourAppName.exe.manifest
).
У Microsoft есть больше информации, доступной здесь: Манифесты приложений. Он даже включает пример манифеста, который вы можете просто скопировать и вставить в пустой текстовый файл, чтобы начать.
Если вы хотите, чтобы ваше приложение запрашивало у пользователя повышение прав, важно установить requestedExecutionLevel
в requireAdministrator
, скорее, чем asInvoker
, Конкретная информация по использованию манифестов с UAC доступна здесь.
Таким образом, полный образец может выглядеть примерно так:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity
version="1.0.0.0"
processorArchitecture="*"
name="MyMagicalApplication"
type="win32"
/>
<description>Sample manifest for your super cool application</description>
<!-- Request version 6 of the common controls. -->
<dependency>
<dependentAssembly>
<assemblyIdentity
type="win32"
name="Microsoft.Windows.Common-Controls"
version="6.0.0.0"
processorArchitecture="*"
publicKeyToken="6595b64144ccf1df"
language="*"
/>
</dependentAssembly>
</dependency>
<!-- Identify the application security requirements. -->
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
<security>
<requestedPrivileges>
<requestedExecutionLevel
level="requireAdministrator"
uiAccess="false"
/>
</requestedPrivileges>
</security>
</trustInfo>
</assembly>
Традиционный способ встроить манифест в исполняемый файл - это использовать mt.exe
утилита, доступная как часть Windows SDK.
На сайте VBAccelerator также есть некоторая информация о встраивании манифестов в приложение VB 6. В частности, он говорит:
Существует два способа предоставления манифеста: самый простой (но наименее элегантный) способ - предоставить манифест на диске для исполняемого файла. Допустим, ваше приложение называется TimeSlot.exe. Затем, если вы сохраните XML-манифест выше, как
TimeSlot.exe.manifest
в том же каталоге, что и исполняемый файл, TimeSlot.exe автоматически получит стили XP. VB5 и VB6 приведены примеры. Если вы переименуете файл.manifest до запуска приложения, вы можете отключить стили XP.
Более надежный метод - скомпилировать манифест как ресурс в вашем приложении. Для этого манифест должен отображаться как тип ресурса
RT_MANIFEST
(24) с идентификаторомCREATEPROCESS_MANIFEST_RESOURCE_ID
(1). По какой-то странной причине вы должны также убедиться, что результирующий XML-файл имеет длину, кратную 4 байтам. Так, например, если ваш файл на самом деле имеет размер 597 байт, вам нужно добавить пробел, чтобы довести размер файла до 600 байт перед компиляцией. Примеры Resource демонстрируют, как создать этот файл ресурсов, используя скрипт компилятора ресурсов (файл.rc) и RC.exe.
Но если вы хотите встроить манифест автоматически при создании приложения из VB 6 IDE, вам придется немного больше трудностей. VB 6 IDE не поддерживает шаги после сборки, поэтому вы не можете просто запустить mt.exe
в командной строке, чтобы сделать это за вас. Я видел в сети несколько утилит, которые утверждают, что автоматически встраивают манифесты для вас, но я считаю, что большинство из них - это старые утилиты, которые обрабатывают только запрос v6 файла ComCtl32.dll. Я не уверен, могут ли они быть легко расширяемыми для включения разрешений UAC, но это стоит того. Вот несколько ссылок, чтобы проверить:
Вот способ включить манифест во время сборки вашего приложения VB6:
- Сохраните файл манифеста, возможно, назовите его my.manifest.
- Убедитесь, что размер файла кратен четырем, как уже упоминал Коди. Если необходимо, заполните его пробелами в конце.
См. Также: Встраивание манифеста приложения в исполняемый файл VB6. Создайте файл ресурсов "my.rc" со следующим содержимым:
#define CREATEPROCESS_MANIFEST_RESOURCE_ID 1 #define RT_MANIFEST 24 CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST "my.manifest"
Вы можете найти больше информации о константах, используемых в блогах msdn. Кажется, вам нужно использовать
#define ISOLATIONAWARE_MANIFEST_RESOURCE_ID 2
для проекта DLL.
- использование
rc.exe
скомпилировать этот файл.rc в файл.res. - Добавьте полученный файл.res в ваш проект VB6.
Я использую это последние несколько месяцев без проблем на двух старых старых приложениях, которые должны были работать на Windows 7. Возможно, вам придется поэкспериментировать с тем, как вы сохраняете файл манифеста, для меня только сохранение его как UTF8 без спецификации работал правильно.
Чтобы проверить, что именно встраивается как манифест таким образом, вы также можете использовать mt.exe
извлечь манифест из вашего скомпилированного exe/dll. Именно это помогло мне найти проблему спецификации...