【问题标题】:Using a manifest to handle UAC in Delphi 5 causes a blank window to be created在 Delphi 5 中使用清单处理 UAC 会导致创建一个空白窗口
【发布时间】:2018-05-15 19:13:37
【问题描述】:

我正在使用在 Windows 7 上运行的 Delphi 5。我们要更新的旧应用程序现在存在 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,但出现重复资源错误,因此我对其进行了更改)以包含清单:

1 24 "InstallTester.manifest"

然后我使用 brcc32.exe 编译了 .rc 文件,它创建了一个 .res 文件。然后我添加了这一行以将 .res 文件包含在 app.dpr 中:

{$R 'Carrie.res'}

然后我建立了这个项目。现在,当我运行它时(在 IDE 之外;在 IDE 内部,我收到错误消息说它需要提升),我没有看到 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.

有人有解决办法吗?

【问题讨论】:

    标签: manifest uac delphi-5


    【解决方案1】:

    此问题与您的清单无关。如果您的 EXE 被编译为控制台应用程序而不是 VCL GUI 应用程序,那么您可以获得该黑色窗口的唯一方法。控制台应用程序可以访问 Win32 API,因此可以显示 GUI 窗口,但它仍然需要控制台窗口。仔细检查您的项目,确保您创建了一个 VCL 表单应用程序,而不是控制台应用程序。

    附带说明:您的清单指定了对 ComCtrl32 v6.0 的依赖项以启用视觉样式。 Delphi 5 早于视觉样式的引入,当启用视觉样式时,VCL 中会出现很多错误。其中一些是通过在您的项目中使用Soft-Gems XP Theme Manager 组件来修复的(最终在后来的Delphi 版本中直接合并到VCL 中)。否则,您应该从清单中删除对 ComCtrls32 v6.0 的依赖,因为您不需要它来支持 UAC。

    【讨论】:

    • 呃……果然——当我查看项目选项时,检查了生成控制台应用程序;不知道这是怎么发生的;我只是做了一个新的应用程序,而不是一个新的控制台应用程序。谢谢,也感谢您提供有关 ComCtrls32 v6.0 的信息。要禁用它,我是否只需取出整个 .. 部分?
    • @Keila 是的,只需删除 &lt;dependency&gt; 部分。您也可以考虑删除&lt;compatibility&gt; 部分,因为Delphi 5 早于Windows XP,因此它实际上与您列出的操作系统版本没有本机兼容性,除非您采取了额外的步骤来设计/测试您的代码确保它实际上是compatible with those OS versions
    • 现在当我尝试运行这个程序时,Delphi 挂起 - Delphi 在顶部显示“无响应”。我可以编译和构建就好了。这个测试程序和我正在为其创建测试程序的程序都表现出这种行为,但其他程序在 IDE 中运行良好。自从上次程序从 IDE 运行良好以来,我唯一能想到的可能就是安装 youseful 包。我尝试在程序选项包列表中取消选中它;同样的结果。我尝试完全删除该软件包;同样的结果。 (我听从了你上面的建议。)
    • 没关系;显然,当我不使用这些程序以管理员模式运行 Delphi 时,就会发生这种情况。
    猜你喜欢
    • 2022-11-08
    • 2022-01-13
    • 2011-11-29
    • 1970-01-01
    • 2021-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-12
    相关资源
    最近更新 更多