几年前,作为 Embarcadero 产品的一部分,我已经使用 Installaware 12 很长时间了。 Embarcadero 下载不再提供此功能,而且 installaware 对于业余开发人员来说非常昂贵。因此,我想将现有的 Installaware 项目迁移到 Inno Setup。
我已经弄清楚如何设置安装程序并将我的文件放置在我想要的位置。 理想情况下,我希望 Inno Setup 安装程序替换我现有的应用程序,而不是进行另一个安装,以便我可以向人们发送我的应用程序的更新,它将替换以前的安装。
Installaware 具有用于安装的“产品代码”和“修订版本代码”。 是否可以在 Inno Setup 中使用这些,以便安装程序将我的应用程序识别为由 installaware 安装的应用程序。
如果是这样,我该怎么做?
我尝试将 Inno Setup“AppId”设置为“产品代码”,但这似乎不起作用,我最终在 Windows 中得到了一个新应用程序。
您可以在
InitializeSetup
中自由卸载任何您想要的 MSI 软件包(由 InstallAware 或其他工具生成)。
[Code]
const
INSTALLSTATE_DEFAULT = 5;
ProductCode = '{34144E9F-E889-467D-A28C-3858D9EBAE24}'; // PHP Manager 2 for IIS is used here. Replace with the actual MSI Product Code
function MsiQueryProductState(ProductCode: String): Integer;
external '[email protected] stdcall';
function IsMSIInstalled(ProductCode: String): Boolean;
var
State: Integer;
begin
State := MsiQueryProductState(ProductCode);
if State = INSTALLSTATE_DEFAULT then
Result := True
else
Result := False;
end;
function InitializeSetup(): Boolean;
var
UserResponse: Integer;
ResultCode: Integer;
begin
if IsMSIInstalled(ProductCode) then
begin
UserResponse := MsgBox('An existing installation of this MSI package was detected. Do you want to uninstall it before proceeding?', mbConfirmation, MB_YESNO);
if UserResponse = IDYES then
begin
if Exec('msiexec.exe', '/x ' + ProductCode + ' /quiet /norestart', '', SW_HIDE, ewWaitUntilTerminated, ResultCode) then
begin
if ResultCode = 0 then
MsgBox('MSI uninstalled successfully.', mbInformation, MB_OK)
else
MsgBox('MSI uninstallation failed with error code: ' + IntToStr(ResultCode), mbError, MB_OK);
end;
end
else
begin
MsgBox('Proceeding with installation without uninstalling the existing MSI package.', mbInformation, MB_OK);
end;
end
else
begin
MsgBox('Didn''t find an existing installation', mbInformation, MB_OK);
end;
Result := True;
end;
请注意,该代码仅用于演示目的。您必须进一步修改它以满足您的确切要求。