AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / coding / 问题

问题[inno-setup](coding)

Martin Hope
ElektroStudios
Asked: 2025-01-09 18:39:48 +0800 CST

位图图像在 Inno Setup 安装程序中自动调整大小

  • 6

TBitmapImage我在 Inno Setup 安装程序的欢迎页面中添加了。当WizardResizable设置设为 True 并调整向导窗口的大小时,承载位图图像的控件边界也会调整大小,并且当发生这种情况时,其背景颜色也会发生变化,如以下屏幕截图所示:

在此处输入图片描述

这是我无意中的行为。我该如何解决?

我尝试将AutoSize属性设置为 false,并使用固定Height的Width属性并测试Anchors组合,但问题仍然存在。

这是我的实际和完整的代码(AuthorWebsiteBitmap是位图):

[Setup]
WizardResizable=yes
WizardStyle=Classic

[Code]
// - - - - - - - - - - - - - - - - - - - - - - //
// Creates the author website related controls //
// - - - - - - - - - - - - - - - - - - - - - - //
procedure CreateAuthorControls(AuthorWebsiteUrl: String);
var
  InstallerAuthorLabel: TNewStaticText;
  AuthorWebsiteLabel  : TNewStaticText;
  AuthorWebsiteBitmap : TBitmapImage;

begin
  // Set AuthorWebsiteBitmap control properties...
  AuthorWebsiteBitmap          := TBitmapImage.Create(WizardForm);
  AuthorWebsiteBitmap.Parent   := WizardForm.WelcomePage;
  AuthorWebsiteBitmap.AutoSize := True;
  AuthorWebsiteBitmap.Left     := (WizardForm.WizardBitmapImage.Left + WizardForm.WizardBitmapImage.Width) + ScaleX(10);
  AuthorWebsiteBitmap.Top      := (WizardForm.WelcomeLabel2.Top + WizardForm.WelcomeLabel2.Height) - (AuthorWebsiteBitmap.Height div 2) - ScaleX(16);
  AuthorWebsiteBitmap.Cursor   := crHand
  AuthorWebsiteBitmap.OnClick  := @AuthorWebsiteControlClick;
  AuthorWebsiteBitmap.Anchors  := [akLeft, akBottom];
  AuthorWebsiteBitmap.Visible  := (AuthorWebsiteUrl <> '');
  
  ExtractTemporaryFiles('{tmp}\WizardBitmaps\AuthorWebsiteWhite.bmp');
  AuthorWebsiteBitmap.Bitmap.LoadFromFile(ExpandConstant('{tmp}\WizardBitmaps\AuthorWebsiteWhite.bmp'));

  // Resize WelcomeLabel2 height to be able see AuthorWebsiteBitmap control.
  WizardForm.WelcomeLabel2.Height := WizardForm.WelcomeLabel2.Height - (AuthorWebsiteBitmap.Height + ScaleY(8));
  // This will not work...
  // AuthorWebsiteBitmap.BringToFront();

  // Set AuthorWebsiteLabel control properties.
  AuthorWebsiteLabel         := TNewStaticText.Create(WizardForm);
  AuthorWebsiteLabel.Parent  := WizardForm.WelcomePage;
  AuthorWebsiteLabel.Left    := AuthorWebsiteBitmap.Left;
  AuthorWebsiteLabel.Top     := AuthorWebsiteBitmap.Top - ScaleY(18);
  AuthorWebsiteLabel.Cursor  := crHand;
  AuthorWebsiteLabel.OnClick := @AuthorWebsiteControlClick;
  AuthorWebsiteLabel.Anchors := [akLeft, akBottom];
  AuthorWebsiteLabel.Visible := (AuthorWebsiteUrl <> '');
  AuthorWebsiteLabel.Caption := CustomMessage('SetupOpenAuthorWebsite');

  // Set InstallerAuthorLabel control properties.
  InstallerAuthorLabel         := TNewStaticText.Create(WizardForm);
  InstallerAuthorLabel.Parent  := WizardForm;
  InstallerAuthorLabel.Left    := ScaleX(2);
  InstallerAuthorLabel.Top     := WizardForm.NextButton.Top + WizardForm.NextButton.Height div 2 + ScaleY(10) - ScaleY(2);
  InstallerAuthorLabel.Anchors := [akLeft, akBottom];
  InstallerAuthorLabel.Caption := CustomMessage('SetupMadeBy');

end;

<event('InitializeWizard')>
procedure InitializeWizard1();
begin
  CreateAuthorControls(ExpandConstant('{#AuthorWebsite}'));
end;

更新

我已经通过这种方式减轻了不必要的颜色变化效果:

AuthorWebsiteBitmap.BackColor := TNewNotebookPage(AuthorWebsiteBitmap.Parent).Color;

但理想的解决方案是避免自动调整大小。

inno-setup
  • 1 个回答
  • 28 Views
Martin Hope
ElektroStudios
Asked: 2025-01-09 13:50:47 +0800 CST

在 Inno Setup 安装程序中使用背景图像填充页脚面板

  • 6

我正在使用 VCLStyles 构建自定义深色风格的 Inno Setup 安装程序,并且我认为能够用图案图像填充页脚空间会给它带来美观、个性化和独特的感觉,而无需改变向导页面的其他部分。

它的外观如下:

在此处输入图片描述

这可能吗?

我一直在 StackOverflow.com 上阅读一些关于InnerPage使用位图填充向导的主题,但我没有找到任何等效的示例来对页眉或页脚面板执行相同的操作。

我试图将我的父级设置TBitmapImage为WizardForm.Bevel控件(我认为这个控件是页脚面板,但我不太确定)但是它引发了类型不匹配错误。

如果我将我的父级设置TBitmapImage为WizardForm,它看起来太可怕了,并且与TaskLists控制可见性相冲突:

在此处输入图片描述

inno-setup
  • 1 个回答
  • 23 Views
Martin Hope
Lilith Helsente
Asked: 2024-12-05 09:55:02 +0800 CST

如何调整单选按钮和“WizardForm.DirEdit”框之间的间距?

  • 5

不久前,我问了一个问题: “我如何为 Steam 和 Epic Games 创建单独的安装路径,通过单选按钮选择,或者为自定义安装创建路径框?”[Code ,Martin Prikryl 对此做出了很好的回应。不幸的是,由于我没有明确说明我在用户体验方面到底做了什么计划,我遇到了一点小麻烦。我试图修复它,但我就是无法理解他控制按钮创建的这一小段。

马丁的部分[Code]:

var
  SteamButton: TNewRadioButton;
  EpicButton: TNewRadioButton;
  CustomButton: TNewRadioButton;

function CreateButton(var Top: Integer): TNewRadioButton;
begin
  Result := TNewRadioButton.Create(WizardForm);
  Result.Parent := WizardForm.DirEdit.Parent;
  Result.Top := Top;
  Result.Left := WizardForm.SelectDirBrowseLabel.Left;
  Result.Width := Result.Parent.ClientWidth - Result.Left;
  Result.OnClick := @DirButtonClick;
  Top := Result.Top + Result.Height + ScaleY(24); 
end;

有人能解释一下如何分离按钮而不是路径框吗?


此处显示所需内容的示例:

示例图像

inno-setup
  • 1 个回答
  • 13 Views
Martin Hope
delphirules
Asked: 2024-11-30 21:40:21 +0800 CST

安装成功后,如何运行作为参数传递的应用程序

  • 5

这是我想要实现的目标:我想调用安装程序,并将安装成功运行后要执行的 EXE 文件作为第一个参数传递。

像这样 :

c:\downloads\myinstall.exe "c:\Program Files (x86)\MyApp\Myapp.exe"

在上述情况下,我想在安装完成后调用“Myapp.exe”。

这可能吗?

inno-setup
  • 2 个回答
  • 23 Views
Martin Hope
Lilith Helsente
Asked: 2024-11-16 06:30:13 +0800 CST

为什么使用“external”标志时只有我的文件夹/子文件夹从 {tmp} 复制到“DestDir”?

  • 6

我最近从压缩Source:目录切换到[Files]下载/解压它们,然后使用标志将它们复制到{tmp}我的目录中,但由于某种原因,只有文件夹和子文件夹被复制,其中的实际文件(.png 文件)并没有与它们一起复制。DestDir:external

我不知道为什么会发生这种情况,在切换之前它运行良好。

[文件]

Source: "{tmp}\pack1\Dead by Daylight\DeadByDaylight\Content\UI\Icons\"; DestDir: "{app}"; Components: pack1; Flags: ignoreversion recursesubdirs createallsubdirs external
Source: "{tmp}\pack2\Dead by Daylight\DeadByDaylight\Content\UI\Icons\"; DestDir: "{app}"; Components: pack2; Flags: ignoreversion recursesubdirs createallsubdirs external

[代码]⠀(很长,抱歉)

{ —————————— Extraction Function ———————————————————————————————————————— }
const
  NO_PROGRESS_BOX = 4;
  RESPOND_YES_TO_ALL = 16;
procedure UnZip(ZipPath, FileName, TargetPath: string); 
var
  Shell: Variant;
  ZipFile: Variant;
  Item: Variant;
  TargetFolder: Variant;
begin
  Shell := CreateOleObject('Shell.Application');

  ZipFile := Shell.NameSpace(ZipPath);
  if VarIsClear(ZipFile) then
    RaiseException(Format('Cannot open ZIP file "%s" or does not exist', [ZipPath]));

  Item := ZipFile.ParseName(FileName);
  if VarIsClear(Item) then
    RaiseException(Format('Cannot find "%s" in "%s" ZIP file', [FileName, ZipPath]));

  TargetFolder := Shell.NameSpace(TargetPath);
  if VarIsClear(TargetFolder) then
    RaiseException(Format('Target path "%s" does not exist', [TargetPath]));

  TargetFolder.CopyHere(Item, NO_PROGRESS_BOX or RESPOND_YES_TO_ALL);
end; // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // //
{ —————————— Download Progress ———————————————————————————————————————— }
var
  DownloadPage: TDownloadWizardPage;
function OnDownloadProgress(const Url, FileName: String; const Progress, ProgressMax: Int64): Boolean;
begin
  if Progress = ProgressMax then
    Log(Format('Successfully downloaded file to {tmp}: %s', [FileName]));
  Result := True;
end; // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // //
{ —————————— Setup Wizard ———————————————————————————————————————— }
procedure InitializeWizard();
begin
{ Download Page }
  DownloadPage := CreateDownloadPage(SetupMessage(msgWizardPreparing), SetupMessage(msgPreparingDesc), @OnDownloadProgress);
  //DownloadPage.ShowBaseNameInsteadOfUrl := True; //Not working for some reason? Inno Setup 6.2.2*
end; // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // //
{ —————————— Download Handling ———————————————————————————————————————— } 
function NextButtonClick(CurPageID: Integer): Boolean;
var
  Temp: string;
begin
  if CurPageID = wpReady then begin
    DownloadPage.Clear;
    if WizardIsComponentSelected('pack1') then 
     DownloadPage.Add('MyDownloadLink1', 'pack1.zip', '');

    if WizardIsComponentSelected('pack2') then 
     DownloadPage.Add('MyDownloadLink2', 'pack2.zip', '');
    DownloadPage.Show;
    try
      try
        DownloadPage.Download;
        Temp := ExpandConstant('{tmp}');
        if WizardIsComponentSelected('pack1') then 
         UnZip(Temp+'\pack1.zip', 'pack1', Temp);

        if WizardIsComponentSelected('pack2') then 
         UnZip(Temp+'\pack2.zip', 'pack2', Temp);
        Result := True;
      except
        if DownloadPage.AbortedByUser then
          Log('Aborted by user.')
        else
          SuppressibleMsgBox(AddPeriod(GetExceptionMessage), mbCriticalError, MB_OK, IDOK);
        Result := False;
      end;
    finally
      DownloadPage.Hide;
    end;
  end else
    Result := True;
end; // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // //

如果还有什么需要,请在评论中告诉我。

inno-setup
  • 1 个回答
  • 22 Views
Martin Hope
Tom
Asked: 2024-10-03 14:58:18 +0800 CST

如何检查 CPU 是否至少有 1.5GHz(每个单核)

  • 6

如何在 InnoSetup 中预先检查 CPU 是否至少有 1.5GHz(每个单核),以便用户在将我的应用程序安装到他们的设备时不会感到失望,而且速度会太慢?

该代码应该用 C++ 来执行,但是我如何将其转换为 InnoSetup 的 Pascal?

#include <iostream>
#include <windows.h>
#include <comdef.h>
#include <Wbemidl.h>

#pragma comment(lib, "wbemuuid.lib")

bool IsCpuAtLeast1_5GHz() {
    HRESULT hres;

    // Initialize COM.
    hres = CoInitializeEx(0, COINIT_MULTITHREADED);
    if (FAILED(hres)) {
        std::cout << "Failed to initialize COM library. Error code = 0x" 
                  << std::hex << hres << std::endl;
        return false;
    }

    // Initialize security.
    hres = CoInitializeSecurity(
        NULL, 
        -1,                          // COM authentication
        NULL,                        // Authentication services
        NULL,                        // Reserved
        RPC_C_AUTHN_LEVEL_DEFAULT,    // Default authentication 
        RPC_C_IMP_LEVEL_IMPERSONATE,  // Default Impersonation
        NULL,                        // Authentication info
        EOAC_NONE,                   // Additional capabilities
        NULL                         // Reserved
    );

    if (FAILED(hres)) {
        std::cout << "Failed to initialize security. Error code = 0x" 
                  << std::hex << hres << std::endl;
        CoUninitialize();
        return false;
    }

    // Obtain the initial locator to WMI.
    IWbemLocator *pLoc = NULL;

    hres = CoCreateInstance(
        CLSID_WbemLocator,             
        0, 
        CLSCTX_INPROC_SERVER, 
        IID_IWbemLocator, (LPVOID *)&pLoc);

    if (FAILED(hres)) {
        std::cout << "Failed to create IWbemLocator object. "
                  << "Error code = 0x" 
                  << std::hex << hres << std::endl;
        CoUninitialize();
        return false;
    }

    // Connect to WMI.
    IWbemServices *pSvc = NULL;
    hres = pLoc->ConnectServer(
         _bstr_t(L"ROOT\\CIMV2"), // WMI namespace
         NULL,                    // User name (NULL = current user)
         NULL,                    // User password (NULL = current user)
         0,                       // Locale             
         NULL,                    // Security flags
         0,                       // Authority        
         0,                       // Context object        
         &pSvc                    // IWbemServices proxy
    );

    if (FAILED(hres)) {
        std::cout << "Could not connect to WMI. Error code = 0x" 
                  << std::hex << hres << std::endl;
        pLoc->Release();     
        CoUninitialize();
        return false;
    }

    // Set security levels on the proxy.
    hres = CoSetProxyBlanket(
       pSvc,                        // Indicates the proxy to set
       RPC_C_AUTHN_WINNT,           // RPC_C_AUTHN_xxx
       RPC_C_AUTHZ_NONE,            // RPC_C_AUTHZ_xxx
       NULL,                        // Server principal name 
       RPC_C_AUTHN_LEVEL_CALL,      // RPC_C_AUTHN_LEVEL_xxx 
       RPC_C_IMP_LEVEL_IMPERSONATE, // RPC_C_IMP_LEVEL_xxx
       NULL,                        // Client identity
       EOAC_NONE                    // Proxy capabilities 
    );

    if (FAILED(hres)) {
        std::cout << "Could not set proxy blanket. Error code = 0x" 
                  << std::hex << hres << std::endl;
        pSvc->Release();
        pLoc->Release();     
        CoUninitialize();
        return false;
    }

    // Use the IWbemServices pointer to make requests of WMI.
    IEnumWbemClassObject* pEnumerator = NULL;
    hres = pSvc->ExecQuery(
        bstr_t("WQL"), 
        bstr_t("SELECT MaxClockSpeed FROM Win32_Processor"),
        WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, 
        NULL,
        &pEnumerator);

    if (FAILED(hres)) {
        std::cout << "WMI query failed. Error code = 0x" 
                  << std::hex << hres << std::endl;
        pSvc->Release();
        pLoc->Release();
        CoUninitialize();
        return false;
    }

    IWbemClassObject *pclsObj = NULL;
    ULONG uReturn = 0;

    // Get the data from the query.
    while (pEnumerator) {
        HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1, &pclsObj, &uReturn);

        if (0 == uReturn) {
            break;
        }

        VARIANT vtProp;
        hr = pclsObj->Get(L"MaxClockSpeed", 0, &vtProp, 0, 0);
        
        // Check if the clock speed is greater than or equal to 1500 MHz.
        if (vtProp.intVal >= 1500) {
            pclsObj->Release();
            pSvc->Release();
            pLoc->Release();
            CoUninitialize();
            return true;
        }

        pclsObj->Release();
    }

    // Cleanup.
    pSvc->Release();
    pLoc->Release();
    pEnumerator->Release();
    CoUninitialize();

    return false;
}

int main() {
    if (IsCpuAtLeast1_5GHz()) {
        std::cout << "CPU is 1.5 GHz or higher." << std::endl;
    } else {
        std::cout << "
inno-setup
  • 1 个回答
  • 58 Views
Martin Hope
Phillipus
Asked: 2024-09-23 23:55:15 +0800 CST

Inno Setup - 如何使用云服务对卸载程序进行代码签名?

  • 5

我正在设置一个 GitHub CI 构建系统,该系统使用 SignPath 签名服务来签名我们的 Inno Setup 安装程序文件。我使用命令行中的 Inno Setup 脚本来创建安装程序 exe 文件,然后将其上传到 SignPath 进行签名。问题是无法使用 SignPath 服务对 Inno Uninstaller 进行签名,因为我们无法控制该部分。

有没有办法中断 Inno Setup 脚本,以便将 Uninstaller exe 文件上传到 SignPath、签名,然后重新下载,然后继续 Inno Setup 脚本?或者也许解压生成的安装程序 exe 以对 Uninstaller exe 进行签名?

inno-setup
  • 1 个回答
  • 29 Views
Martin Hope
testalino
Asked: 2024-09-10 15:45:16 +0800 CST

在脚本中自定义 Inno Setup ReadyLabel1

  • 5

[Messages]您可以在部分中自定义ReadyLabel1。

不过,我想包含脚本代码来定制消息。

我可以从功能中调整标签文本InitializeWizard吗?

inno-setup
  • 1 个回答
  • 16 Views
Martin Hope
emendelson
Asked: 2024-05-19 20:41:16 +0800 CST

Inno Setup:显示安装目录,但不允许更改?

  • 5

在 InnoSetup 安装程序中,我想要求安装位于特定文件夹中,但我希望用户看到该文件夹​​是什么。有没有办法做到这一点?

如果我使用DisableDirPage=no那么用户可以更改安装文件夹。如果我使用,DisableDirPage=yes那么用户将无法看到安装将去往何处。

是否可以显示文件夹而不允许更改它?

编辑:回答评论:我不是问如何强制安装到特定文件夹中,因为我已经知道了。我应该说清楚的。我只是问如何向用户显示安装文件夹(因为这是我想知道的事情)。

inno-setup
  • 1 个回答
  • 13 Views
Martin Hope
Inside Man
Asked: 2024-05-04 04:55:13 +0800 CST

一份数据和多个Setup exe安装程序 - Inno Setup

  • 5

有没有办法将数据准备为 setup.bin,然后为该 bin 文件创建不同的安装程序?

数据巨大。我需要创建一个在其上播放视频的安装程序、一个让用户选择某些选项的安装程序以及一个一键安装数据的简单安装程序

数据在服务器上,每个用户都可以选择他想要的设置类型。然后我需要重新编译安装程序并向他提供安装程序的链接。

如果我想用每个用户的数据重新编译整个设置,则需要很长的时间和空间。

希望我清楚我的目标。

inno-setup
  • 1 个回答
  • 30 Views

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    重新格式化数字,在固定位置插入分隔符

    • 6 个回答
  • Marko Smith

    为什么 C++20 概念会导致循环约束错误,而老式的 SFINAE 不会?

    • 2 个回答
  • Marko Smith

    VScode 自动卸载扩展的问题(Material 主题)

    • 2 个回答
  • Marko Smith

    Vue 3:创建时出错“预期标识符但发现‘导入’”[重复]

    • 1 个回答
  • Marko Smith

    具有指定基础类型但没有枚举器的“枚举类”的用途是什么?

    • 1 个回答
  • Marko Smith

    如何修复未手动导入的模块的 MODULE_NOT_FOUND 错误?

    • 6 个回答
  • Marko Smith

    `(表达式,左值) = 右值` 在 C 或 C++ 中是有效的赋值吗?为什么有些编译器会接受/拒绝它?

    • 3 个回答
  • Marko Smith

    在 C++ 中,一个不执行任何操作的空程序需要 204KB 的堆,但在 C 中则不需要

    • 1 个回答
  • Marko Smith

    PowerBI 目前与 BigQuery 不兼容:Simba 驱动程序与 Windows 更新有关

    • 2 个回答
  • Marko Smith

    AdMob:MobileAds.initialize() - 对于某些设备,“java.lang.Integer 无法转换为 java.lang.String”

    • 1 个回答
  • Martin Hope
    Fantastic Mr Fox msvc std::vector 实现中仅不接受可复制类型 2025-04-23 06:40:49 +0800 CST
  • Martin Hope
    Howard Hinnant 使用 chrono 查找下一个工作日 2025-04-21 08:30:25 +0800 CST
  • Martin Hope
    Fedor 构造函数的成员初始化程序可以包含另一个成员的初始化吗? 2025-04-15 01:01:44 +0800 CST
  • Martin Hope
    Petr Filipský 为什么 C++20 概念会导致循环约束错误,而老式的 SFINAE 不会? 2025-03-23 21:39:40 +0800 CST
  • Martin Hope
    Catskul C++20 是否进行了更改,允许从已知绑定数组“type(&)[N]”转换为未知绑定数组“type(&)[]”? 2025-03-04 06:57:53 +0800 CST
  • Martin Hope
    Stefan Pochmann 为什么 {2,3,10} 和 {x,3,10} (x=2) 的顺序不同? 2025-01-13 23:24:07 +0800 CST
  • Martin Hope
    Chad Feller 在 5.2 版中,bash 条件语句中的 [[ .. ]] 中的分号现在是可选的吗? 2024-10-21 05:50:33 +0800 CST
  • Martin Hope
    Wrench 为什么双破折号 (--) 会导致此 MariaDB 子句评估为 true? 2024-05-05 13:37:20 +0800 CST
  • Martin Hope
    Waket Zheng 为什么 `dict(id=1, **{'id': 2})` 有时会引发 `KeyError: 'id'` 而不是 TypeError? 2024-05-04 14:19:19 +0800 CST
  • Martin Hope
    user924 AdMob:MobileAds.initialize() - 对于某些设备,“java.lang.Integer 无法转换为 java.lang.String” 2024-03-20 03:12:31 +0800 CST

热门标签

python javascript c++ c# java typescript sql reactjs html

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve