我的应用程序有一个安装文件,它还包含 .exe 文件和 .zip 文件。
最近我在从zip中提取文件的部分添加了一段代码[Code],但实际上,它是在安装完成后发生的,并且进度条为100%,所以我想要的是使该代码的(解压缩)过程与进度条并向用户显示当前正在提取的内容。
例如:假设提取文件将占用进度条的 50%,其余部分将占用解压缩时的代码部分,以及当前正在提取的内容的状态。
[Code]
procedure InitializeWizard;
begin
ForceDirectories(ExpandConstant('{localappdata}\folder-A\app\folder-B'))
end;
const
SHCONTCH_NOPROGRESSBOX = 4;
SHCONTCH_RESPONDYESTOALL = 16;
procedure unzip(ZipFile, TargetFldr: variant);
var
shellobj: variant;
SrcFldr, DestFldr: variant;
shellfldritems: variant;
begin
if FileExists(ZipFile) then begin
if not DirExists(TargetFldr) then
if not ForceDirectories(TargetFldr) then begin
MsgBox('Can not create folder '+TargetFldr+' !!', mbError, MB_OK);
Exit;
end;
shellobj := CreateOleObject('Shell.Application');
SrcFldr := shellobj.NameSpace(ZipFile);
DestFldr := shellobj.NameSpace(TargetFldr);
shellfldritems := SrcFldr.Items;
DestFldr.CopyHere(
shellfldritems, SHCONTCH_NOPROGRESSBOX or SHCONTCH_RESPONDYESTOALL);
end;
procedure …Run Code Online (Sandbox Code Playgroud) Inno Setup是否支持函数指针?我在文档中找不到任何内容.我知道Delphi/Pascal支持它们,因为Inno Setup脚本引擎是基于它的,我希望它得到支持.
我的程序安装了一个驱动程序,它有针对XP,Win2003,Vista/Win2008和Win7编译的不同版本.我使用pascal函数来检查哪个是OS,并安装相应的DLL.
在某些用户的系统上没有安装DLL,这意味着所有函数都返回false.只要操作系统的主要版本是5或6,就不会发生这种情况.
任何人都可以告诉我,我使用的代码是否有问题?
[Code]
function UseDriverForWindows7(): Boolean;
var
Version: TWindowsVersion;
begin
GetWindowsVersionEx(Version);
// Windows 7 version is 6.1 (workstation)
if (Version.Major = 6) and
(Version.Minor = 1) and
(Version.ProductType = VER_NT_WORKSTATION)
then
Result := True
else
Result := False;
end;
function UseDriverForWindowsVistaAndWindows2008(): Boolean;
var
Version: TWindowsVersion;
begin
GetWindowsVersionEx(Version);
// Anything with major version 6 where we won't use Windows 7 driver
if (Version.Major = 6) and
(not UseDriverForWindows7)
then
Result := True
else
Result := False;
end;
function UseDriverForWindows2003(): Boolean; …Run Code Online (Sandbox Code Playgroud) 有没有办法在运行安装程序时从PascalScript访问文件列表([Files]部分中的条目)?我们试图直接从设置中运行应用程序,而不是必须安装它,这样可以更容易地维护文件列表.
Inno Setup WizardImageFile(和WizardSmallImageFile)的位图看起来很糟糕,因为当 Windows 7 启用了大系统字体时,向导会比平时大,但图像的缩放比例非常错误。
有解决办法吗?
如果我在这样的地方添加自己的图片,就没有类似的问题:
BitmapImage1.AutoSize := True;
BitmapImage1.Align := alClient;
BitmapImage1.Left := 0;
BitmapImage1.Top := 0;
BitmapImage1.stretch := True;
BitmapImage1.Parent := Splash;
Run Code Online (Sandbox Code Playgroud) 我希望能够为我的Inno Setup项目构建我的代码,但是我被迫移动代码,因为除非先定义函数,否则无法调用函数.
有没有办法在顶部声明一个原型,以便我没有得到"未知标识符"错误,以便我可以在逻辑块中构建我的代码.
我在Inno Setup中创建了自己的自定义最小化按钮。
我想知道如何在单击时最小化安装程序。
最小化应该类似于安装程序边框上的默认最小化按钮。
我想知道如何确定目标机器中是否安装了特定的Windows Update软件包,例如名称为KB2919355的Windows Update软件包.
是否存在内置功能来检查?如果没有,那么确定它所需的代码是什么?也许搞乱注册表,或者可能是最干净和/或最安全的方式?
伪代码:
[Setup]
...
[Files]
Source: {app}\*; DestDir: {app}; Check: IsPackageInstalled('KB2919355')
[Code]
function IsPackageInstalled(packageName): Boolean;
begin
...
Result := ...;
end;
Run Code Online (Sandbox Code Playgroud) 我试图在安装过程中在Inno Setup脚本中使用自定义DLL。我编写了一个非常简单的函数,该函数基本上使用MySQL .NET连接器检查MySQL数据库的连接字符串(目标服务器上没有MySQL客户端)。此导出函数的代码为:
public class DbChecker
{
[DllExport("CheckConnexion", CallingConvention.StdCall)]
public static int CheckConnexion([MarshalAs(UnmanagedType.LPStr)] string connexionString)
{
int success;
try
{
MySqlConnection connection = new MySqlConnection(connexionString);
connection.Open();
connection.Close();
success = 0;
}
catch (Exception)
{
success = 1;
}
return success;
}
}
Run Code Online (Sandbox Code Playgroud)
该函数以这种方式导入Inno Setup中:
[Files]
Source: "..\..\MyDll\bin\x86\Release\*"; Flags: dontcopy;
Run Code Online (Sandbox Code Playgroud)
和
[Code]
function CheckConnexion(connexionString: AnsiString): Integer;
external 'CheckConnexion@files:MyDll.dll,MySql.Data.dll stdcall setuponly loadwithalteredsearchpath';`
Run Code Online (Sandbox Code Playgroud)
问题是安装程序在运行时引发异常:
运行时错误(位于53:207):
外部异常E0434352。
我认为我必须使用files前缀,因为在将NextButtonClick文件复制到{app}目录之前,在事件处理程序中调用了该函数。
两者MyDll.dll和MySql.Data.dll都{tmp}在运行时正确提取到目录中。
我尝试了带有和不loadwithalteredsearchpath带有标志的结果相同。 …
我已将以下代码添加到我的脚本中:
[Code]
function IsSomeAppInstalled: Boolean;
begin
Result := FileExists(ExpandConstant('{pf32}\SomeApp\Some.dll'));
end;
function InitializeSetup(): Boolean;
begin
Boolean bIsInstalled := IsSomeAppInstalled();
MsgBox('IsSomeAppInstalled: ' + IntToStr(Integer(bIsInstalled)),
mbInformation, MB_OK);
Result := true;
end;
Run Code Online (Sandbox Code Playgroud)
线
Boolean bIsInstalled := IsSomeAppInstalled();
Run Code Online (Sandbox Code Playgroud)
引发错误
内部错误 (20)
这里可能是什么错误?