我知道可以使用以下代码在任何页面上创建自定义按钮并使用绝对值定位它:
//Create the About button
AboutButton := TButton.Create(WizardForm);
AboutButton.Caption := '&About';
AboutButton.Width := ScaleX(75);
AboutButton.Height := ScaleY(23);
AboutButton.Left := WizardForm.InfoAfterPage.Left + 10;
AboutButton.Top := WizardForm.InfoAfterPage.Height + 90;
AboutButton.OnClick := @AboutButtonClick;
AboutButton.Parent := WizardForm.NextButton.Parent;
Run Code Online (Sandbox Code Playgroud)
唯一的问题是,由于它使用绝对值进行定位,如果用户打开了 Windows 缩放(在屏幕分辨率 > 放大或缩小文本和其他项目下)并且缩放设置为中 125%,则按钮会出现与其他内置按钮不对齐,导致一团糟。因此,有没有一种方法可以将任何新创建的自定义按钮与内置按钮相关联,以便它们始终按预期显示在一行中?或者有没有其他解决方案可以解决我忽略的这种扩展困境?
我试图找到一种查询Windows服务状态的方法,即它是运行,停止还是禁用.我知道我可以使用sc.exe query ServiceName,但这将涉及使用批处理文件来查找输出中的状态,管道到文件然后读取它,这似乎有点复杂.我在MSDN上找到了以下Windows API函数,我相信它可能会做我想要的,但我不知道如何或是否可以将其合并到Inno Setup中.或者,是否有另一种方法可用于使用Inno Setup本机返回Windows服务的状态?
设置SetupLogging=yes创建一个文件:
%TEMP%\安装日志 YYYY-MM-DD #NNN.txt
有什么办法可以指定文件名吗?请注意,我知道我可以FileCopy在安装结束时使用它重命名(How can I log Inno Setup Installations?),但我只想在开始时指定文件的名称,就像使用 switch 可以完成的那样/log=%TEMP%\ProductInstall.log。这可能吗?
我正在尝试MsgBox使用三个按钮和三个结果创建一个,但我无法看到如何创建第三个结果?我目前有两个按钮的代码MsgBox,它完美地工作:
if ((strExistingInstallPath <> '') and (strExistingVersion = '2.5.3')) then
begin
if SuppressibleMsgBox('Setup has detected that ' + strMyAppName + ' ' + strExistingVersion + '.' + strExistingBuild + ' is installed.' + #13#10 + #13#10 +
'The existing version must be removed before installing or upgrading to ' + strMyAppVersion + '.' + strMyAppBuild + '.' + #13#10 + #13#10 +
'Would you like Setup to uninstall the existing version?',
mbConfirmation, MB_YESNO, IDYES) = IDYES …Run Code Online (Sandbox Code Playgroud) 我经常发现我需要内置控件的名称,例如WizardForm.StatusLabel。某处是否有对所有内置控件名称的明确引用,如果没有,您如何找到这些?WizardForm.InstallingPage作为一个有效的示例,我如何找到显示在ie 下面的标签上提取的文件名的控件的名称WizardForm.StatusLabel?
我正在尝试编写一个函数,该函数将依次检查每个驱动器上是否存在特定目录,将找到它的路径存储为变量,如果存在则返回 true,否则返回 false:
function IsDirPresent(): Boolean;
var
chrDriveLetter: Char;
strMyDir: String;
begin
for chrDriveLetter := 'A' to 'Z' do
begin
if DirExists(chrDriveLetter + ':\MyDir') then
strMyDirPath := chrDriveLetter + ':\MyDir'
end;
if strMyDirPath <> '' then
Result := True;
end;
Run Code Online (Sandbox Code Playgroud)
编译时,我的循环行出现类型不匹配错误。我正在努力找出循环出了什么问题,并且无法找到有关如何在 Inno Setup 中正确创建从 A 到 Z 的循环的任何信息。
我目前正在安装.NET Framework 4.6.2作为PrepareToInstall事件功能的先决条件,以便我可以获取退出代码,设置NeedsReboot状态或在安装失败时中止.我的代码在下面,这一切都正常.
var
PrepareToInstallLabel: TNewStaticText;
PrepareToInstallProgressBar: TNewProgressBar;
intDotNetResultCode: Integer;
CancelWithoutPrompt, AbortInstall: Boolean;
function InitializeSetup(): Boolean;
begin
Result := True;
OverwriteDB := False;
CancelWithoutPrompt := False;
AbortInstall := False;
end;
function PrepareToInstall(var NeedsRestart: Boolean): String;
var
intResultCode: Integer;
strInstallType: String;
begin
if not IsDotNet45Installed and IsWindows7Sp1OrAbove then
begin
HidePrepareToInstallGuiControls;
PrepareToInstallLabel.Caption := 'Installing Microsoft .NET Framework 4.6.2...';
ShowPrepareToInstallGuiControls;
ExtractTemporaryFile('NDP462-KB3151800-x86-x64-AllOS-ENU.exe');
if WizardSilent = True then
begin
strInstallType := '/q';
end
else
begin
strInstallType := '/passive';
end;
Exec(ExpandConstant('{tmp}\NDP462-KB3151800-x86-x64-AllOS-ENU.exe'), strInstallType …Run Code Online (Sandbox Code Playgroud) 我正在创建一个仅需要安装32位文件的安装程序,它们可以在64位和32位计算机上工作。
我在64位计算机上运行Inno安装程序,即使安装模式为32位,文件仍最终位于该SysWOW64文件夹中。该Dest指令集来{sys}
Source: "C:\Users\Lablabla\Documents\Visual Studio 2013\Projects\Test\MyDll.dll"; DestDir: "{sys}"; Flags: 32bit
Run Code Online (Sandbox Code Playgroud)
奇怪的是,日志显示目标为system32,安装模式为32位
2015-04-12 01:04:14.046 64-bit Windows: Yes
2015-04-12 01:04:14.046 Processor architecture: x64
2015-04-12 01:04:14.046 User privileges: Administrative
2015-04-12 01:04:14.046 64-bit install mode: No
....
2015-04-12 01:04:20.237 Dest filename: C:\Windows\system32\MyDll.dll
Run Code Online (Sandbox Code Playgroud)
但是,完成安装后SysWOW64,即使可执行文件位于正确的位置,该文件也位于文件夹中。Program Files (x86)
即使将特定32bit标志设置为dll文件,也会发生这种情况。
安装非常简单,只有这个dll和一个可执行文件。没有注册表或其他更复杂的东西。
任何人都经历过这样的事情吗?
谢谢