Manifest 在Delphi5中使用清单处理UAC会导致创建一个空白窗口

Manifest 在Delphi5中使用清单处理UAC会导致创建一个空白窗口,manifest,uac,delphi-5,Manifest,Uac,Delphi 5,我使用的是运行在Windows7上的Delphi5。我们现在要更新的旧应用程序与UAC存在问题。我们可以通过更改注册表中的EnableLUA设置来解决这个问题,但这不是一个理想的解决方案。我正在努力提升它,并在网上找到了很多关于如何提升的信息。在搞乱这个程序之前,我创建了一个非常简单的新程序,名为InstallTester,用来找出解决这个问题所需的过程。然后我创建了一个名为InstallTester.manifest的清单: <?xml version="1.0" encoding="U

我使用的是运行在Windows7上的Delphi5。我们现在要更新的旧应用程序与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>
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.


有人有解决方案吗?

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


另请注意:您的清单正在指定对ComCtrl32 v6.0的依赖项以启用视觉样式。Delphi5早于视觉样式的引入,当视觉样式被启用时,VCL中会出现很多错误。其中一些是通过在项目中使用组件修复的(最终在更高版本的Delphi中直接合并到VCL中)。否则,您应该从清单中删除对ComCtrls32 v6.0的依赖,因为UAC支持不需要它。

Ugh…果然——当我查看项目选项时,选中了Generate console应用程序;不知道这是怎么发生的;我只是做了一个新的应用程序,而不是一个新的控制台应用程序。谢谢,同时也感谢您提供有关ComCtrls32 v6.0的信息。要禁用它,我是不是要把整个。。部分?@Keila是的,只需删除
部分。由于Delphi 5早于WindowsXP,所以它也可以考虑取出<代码> <代码>节,所以它实际上与您列出的OS版本没有天生的兼容性,除非您已经采取额外的步骤来设计/测试您的代码以确保它是实际的。现在,当我尝试运行这个程序时,Delphi Hung- Delphi已经“没有回应“出现在顶端。我可以很好地编译和构建。这个测试程序&我为其创建测试程序的程序都表现出这种行为,但其他程序在IDE中运行良好。自从上次程序从IDE正常运行以来,我能想到的唯一一件事就是安装youseful软件包。我尝试在程序选项包列表中取消选中它;同样的结果。我试着把那个包裹完全拿走;同样的结果。(我按照你上面的建议)没关系;显然,当我不在管理员模式下运行这些程序时,就会发生这种情况。
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.