在 Delphi 5 中使用清单处理 UAC 会导致创建空白 window
Using a manifest to handle UAC in Delphi 5 causes a blank window to be created
我正在 Delphi 5 运行ning 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,但出现重复资源错误,所以我更改了它)以包含清单:
1 24 "InstallTester.manifest"
然后我使用 brcc32.exe 编译了 .rc 文件,它创建了一个 .res 文件。然后我添加了将 .res 文件包含在 app.dpr:
中的行
{$R 'Carrie.res'}
然后我构建了项目。现在,当我 运行 它时(在 IDE 之外;在 IDE 内部,我收到错误消息说它需要提升),我没有得到 Windows window 询问我是否给予任何许可。相反,我得到了应用程序,外加一个看起来像命令提示符 window 但没有任何文本的 window。它有一个光标,但我无法在其中输入任何内容:
为了以防万一,这里是完整的代码:
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.
有人有解决办法吗?
此问题与您的清单无关。获得黑色 window 的唯一方法是将 EXE 编译为控制台应用程序而不是 VCL GUI 应用程序。控制台应用程序可以访问 Win32 API,因此可以显示 GUI windows,但它仍然需要控制台 window。仔细检查您的项目,确保您首先创建的是 VCL 表单应用程序,而不是控制台应用程序。
附带说明:您的清单指定了对 ComCtrl32 v6.0 的依赖以启用视觉样式。 Delphi 5 早于视觉样式的引入,并且在启用视觉样式时 VCL 中会出现相当多的错误。其中一些是通过在您的项目中使用 Soft-Gems XP Theme Manager 组件来修复的(最终在后来的 Delphi 版本中直接合并到 VCL 中)。否则,您应该从清单中删除对 ComCtrls32 v6.0 的依赖,因为 UAC 支持不需要它。
我正在 Delphi 5 运行ning 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,但出现重复资源错误,所以我更改了它)以包含清单:
1 24 "InstallTester.manifest"
然后我使用 brcc32.exe 编译了 .rc 文件,它创建了一个 .res 文件。然后我添加了将 .res 文件包含在 app.dpr:
中的行{$R 'Carrie.res'}
然后我构建了项目。现在,当我 运行 它时(在 IDE 之外;在 IDE 内部,我收到错误消息说它需要提升),我没有得到 Windows window 询问我是否给予任何许可。相反,我得到了应用程序,外加一个看起来像命令提示符 window 但没有任何文本的 window。它有一个光标,但我无法在其中输入任何内容:
为了以防万一,这里是完整的代码:
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.
有人有解决办法吗?
此问题与您的清单无关。获得黑色 window 的唯一方法是将 EXE 编译为控制台应用程序而不是 VCL GUI 应用程序。控制台应用程序可以访问 Win32 API,因此可以显示 GUI windows,但它仍然需要控制台 window。仔细检查您的项目,确保您首先创建的是 VCL 表单应用程序,而不是控制台应用程序。
附带说明:您的清单指定了对 ComCtrl32 v6.0 的依赖以启用视觉样式。 Delphi 5 早于视觉样式的引入,并且在启用视觉样式时 VCL 中会出现相当多的错误。其中一些是通过在您的项目中使用 Soft-Gems XP Theme Manager 组件来修复的(最终在后来的 Delphi 版本中直接合并到 VCL 中)。否则,您应该从清单中删除对 ComCtrls32 v6.0 的依赖,因为 UAC 支持不需要它。