Использование манифеста для обработки UAC в Delphi 5 приводит к созданию пустого окна - PullRequest
0 голосов
/ 15 мая 2018

Я использую Delphi 5, работающую в Windows 7. У старого приложения, которое мы хотим обновить, теперь есть проблемы с UAC. Мы можем обойти это, изменив настройку EnableLUA в реестре, но это НЕ идеальное решение. Я пытаюсь поднять его и нашел много информации в Интернете о том, как это сделать. Прежде чем связываться с этой программой, я создал очень простую новую программу под названием InstallTester, чтобы использовать ее, чтобы выяснить процесс, который мне нужно использовать, чтобы исправить это. Затем я создал манифест с именем InstallTester.manifest:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
  <assemblyIdentity type="win32" name="InstallTester" version="1.0.0.0" processorArchitecture="x86"/>
  <dependency>
    <dependentAssembly>
      <assemblyIdentity
        type="win32"
        name="Microsoft.Windows.Common-Controls"
        version="6.0.0.0"
        publicKeyToken="6595b64144ccf1df"
        language="*"
        processorArchitecture="*"/>
    </dependentAssembly>
  </dependency>
  <!-- Windows Vista application security requirements. -->
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
    <security>
      <requestedPrivileges>
        <requestedExecutionLevel
          level="requireAdministrator"
          uiAccess="false"/>
        </requestedPrivileges>
       </security>
  </trustInfo>
  <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
    <application>
      <!--Windows 7-->
      <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
      <!--Windows Vista-->
      <supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/>
    </application>
  </compatibility>
</assembly>

Затем я создал файл .rc (называемый Carrie.rc; сначала я попытался назвать его InstallTester.rc, но у меня появилась ошибка Duplicate Resources, поэтому я изменил его), чтобы включить манифест:

1 24 "InstallTester.manifest"

Затем я скомпилировал файл .rc, используя brcc32.exe, который создал файл .res. Затем я добавил строку, чтобы включить файл .res в app.dpr:

{$R 'Carrie.res'}

Тогда я построил проект. И теперь, когда я запускаю его (вне IDE; внутри IDE я получаю сообщение об ошибке, требующее повышения прав), я не получаю окно Windows, спрашивающее, даю ли я какое-либо разрешение. Вместо этого я получаю приложение плюс окно, которое выглядит как окно командной строки, но без текста. У него есть курсор, но я ничего не могу напечатать:

Screen shot of both windows

На всякий случай, если это полезно, вот полный код:

program InstallTester;

{$R *.res}
{$R 'Carrie.res'}

uses
  Forms,
  InstallTest in 'InstallTest.pas' {Form1};

begin
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.

unit InstallTest;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
begin
  MessageDlg( 'Thanks!', mtInformation, [mbOK], 000 );
end;

end.

У кого-нибудь есть решение?

1 Ответ

0 голосов
/ 15 мая 2018

Эта проблема не имеет ничего общего с вашим манифестом. Единственный способ получить это черное окно - это если ваш EXE-файл скомпилирован как консольное приложение, а не как приложение VCL GUI. Консольное приложение имеет доступ к Win32 API и, следовательно, может отображать окна с графическим интерфейсом, но для него по-прежнему требуется также консольное окно. Дважды проверьте ваш проект, убедитесь, что вы создали приложение VCL Forms, а не консольное приложение.

Примечание: в вашем манифесте указана зависимость от ComCtrl32 v6.0 для включения визуальных стилей. Delphi 5 предшествует внедрению визуальных стилей, и в VCL довольно много ошибок, которые появляются, когда визуальные стили включены. Некоторые из них исправлены с помощью компонента *1003* Soft-Gems XP Theme Manager в вашем проекте (который в конечном итоге был включен непосредственно в VCL в более поздней версии Delphi). В противном случае вы должны удалить зависимость от ComCtrls32 v6.0 из вашего манифеста, так как она вам не нужна для поддержки UAC.

...