Inno Setup里运行另外一个安装包

puddingli 2016-06-30 03:11:30
我想用Inno Setup做一个安装包A,里面打包另外一个安装包B。运行安装包A后,先执行安装包B来安装(最好是静默安装),安装好后,再把另外一个新文件wr.exe替换安装包B安装的程序老的wr.exe(安装包B的安装路径是固定的,C:\wr\)。该怎么办?安装包A安装时可以不用新建目录或者建一个临时的也行。谢谢大家。

下面是安装包B的文件,要执行里面的SETUP.EXE
C:\test\_ISDEL.EXE
C:\test\_SETUP.1
C:\test\_SETUP.DLL
C:\test\_SETUP.LIB
C:\test\DISK1.ID
C:\test\SETUP.EXE
C:\test\SETUP.INI
C:\test\SETUP.INS
C:\test\SETUP.PKG

安装完后要替换的新的wr.exe
C:\testwr\wr.exe
...全文
1287 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
「已注销」 2018-08-22
  • 打赏
  • 举报
回复
引用 8 楼 qq_35640892 的回复:
保持1.exe中其他文件不变,只替换shell.dll这个同名文件,急,谢谢
原先的文件改名,比如将 shell.dll 改 shell.dll.del0、shell.dll.del1 等等,然后将这个文件设置为重启后删除,释放新的文件 shell.dll。
qq_35640892 2018-08-16
  • 打赏
  • 举报
回复
保持1.exe中其他文件不变,只替换shell.dll这个同名文件,急,谢谢
qq_35640892 2018-08-16
  • 打赏
  • 举报
回复
楼主,请问如果说我要模拟安装包升级,怎么在低版本中安装重新安装一个文件替换原来低版本中的这个同名文件;举例说明一下:有1.exe安装包已经安装,现要做个升级,升级用的文件shell.dll打包成2.exe(只包含这一个文件),安装2.exe替换1.exe中的shell.dll文件
puddingli 2016-07-05
  • 打赏
  • 举报
回复
引用 5 楼 SXJIAKE 的回复:
[quote=引用 4 楼 mjdy123 的回复:]
[Setup]
AppName=Example
AppVersion=1.0
DefaultDirName=Example
   
[Files]
Source: "C:\1\_ISDEL.EXE";  DestDir: "{tmp}\wr"
Source: "C:\1\_SETUP.1";    DestDir: "{tmp}\wr"
Source: "C:\1\_SETUP.DLL";  DestDir: "{tmp}\wr"
Source: "C:\1\_SETUP.LIB";  DestDir: "{tmp}\wr"
Source: "C:\1\DISK1.ID";    DestDir: "{tmp}\wr"
Source: "C:\1\SETUP.INI";   DestDir: "{tmp}\wr"
Source: "C:\1\SETUP.INS";   DestDir: "{tmp}\wr"
Source: "C:\1\SETUP.PKG";   DestDir: "{tmp}\wr"
Source: "C:\1\setup.iss";   DestDir: "{tmp}\wr"
Source: "C:\1\SETUP.EXE";   DestDir: "{tmp}\wr"; AfterInstall: MyAfterInstall1
 
Source: "C:\2\Install.exe"; DestDir: "{tmp}"; AfterInstall: MyAfterInstall2
   
[Code]
procedure MyAfterInstall1();
var 
    ResultCode: Integer;
begin
    Exec(ExpandConstant(CurrentFileName), '-s', '', SW_HIDE, ewWaitUntilTerminated, ResultCode);
end;
  
procedure MyAfterInstall2();
var 
    ResultCode: Integer;
begin
    Exec(ExpandConstant(CurrentFileName), '/verysilent sp-', '', SW_HIDE, ewWaitUntilTerminated, ResultCode);
end;
再改了一下
根据我上面的修改修改,应该能满足你的要求。 如果要对其中的某个文件进行拷贝,直接用我之前回复中的 CopyFile 这个函数。[/quote] 谢谢,我测试了一下,已经很好地满足了我的要求。就是我设置了应用程序不需要文件夹,不过安装包会在WINDOWS目录下生成一个卸载的程序,不太好看啊,不过没有关系了。谢谢,结贴。
「已注销」 2016-07-05
  • 打赏
  • 举报
回复
引用 4 楼 mjdy123 的回复:
[Setup]
AppName=Example
AppVersion=1.0
DefaultDirName=Example
   
[Files]
Source: "C:\1\_ISDEL.EXE";  DestDir: "{tmp}\wr"
Source: "C:\1\_SETUP.1";    DestDir: "{tmp}\wr"
Source: "C:\1\_SETUP.DLL";  DestDir: "{tmp}\wr"
Source: "C:\1\_SETUP.LIB";  DestDir: "{tmp}\wr"
Source: "C:\1\DISK1.ID";    DestDir: "{tmp}\wr"
Source: "C:\1\SETUP.INI";   DestDir: "{tmp}\wr"
Source: "C:\1\SETUP.INS";   DestDir: "{tmp}\wr"
Source: "C:\1\SETUP.PKG";   DestDir: "{tmp}\wr"
Source: "C:\1\setup.iss";   DestDir: "{tmp}\wr"
Source: "C:\1\SETUP.EXE";   DestDir: "{tmp}\wr"; AfterInstall: MyAfterInstall1
 
Source: "C:\2\Install.exe"; DestDir: "{tmp}"; AfterInstall: MyAfterInstall2
   
[Code]
procedure MyAfterInstall1();
var 
    ResultCode: Integer;
begin
    Exec(ExpandConstant(CurrentFileName), '-s', '', SW_HIDE, ewWaitUntilTerminated, ResultCode);
end;
  
procedure MyAfterInstall2();
var 
    ResultCode: Integer;
begin
    Exec(ExpandConstant(CurrentFileName), '/verysilent sp-', '', SW_HIDE, ewWaitUntilTerminated, ResultCode);
end;
再改了一下
根据我上面的修改修改,应该能满足你的要求。 如果要对其中的某个文件进行拷贝,直接用我之前回复中的 CopyFile 这个函数。
puddingli 2016-07-04
  • 打赏
  • 举报
回复
[Setup]
AppName=Example
AppVersion=1.0
DefaultDirName=Example
   
[Files]
Source: "C:\1\_ISDEL.EXE";  DestDir: "{tmp}\wr"
Source: "C:\1\_SETUP.1";    DestDir: "{tmp}\wr"
Source: "C:\1\_SETUP.DLL";  DestDir: "{tmp}\wr"
Source: "C:\1\_SETUP.LIB";  DestDir: "{tmp}\wr"
Source: "C:\1\DISK1.ID";    DestDir: "{tmp}\wr"
Source: "C:\1\SETUP.INI";   DestDir: "{tmp}\wr"
Source: "C:\1\SETUP.INS";   DestDir: "{tmp}\wr"
Source: "C:\1\SETUP.PKG";   DestDir: "{tmp}\wr"
Source: "C:\1\setup.iss";   DestDir: "{tmp}\wr"
Source: "C:\1\SETUP.EXE";   DestDir: "{tmp}\wr"; AfterInstall: MyAfterInstall1
 
Source: "C:\2\Install.exe"; DestDir: "{tmp}"; AfterInstall: MyAfterInstall2
   
[Code]
procedure MyAfterInstall1();
var 
    ResultCode: Integer;
begin
    Exec(ExpandConstant(CurrentFileName), '-s', '', SW_HIDE, ewWaitUntilTerminated, ResultCode);
end;
  
procedure MyAfterInstall2();
var 
    ResultCode: Integer;
begin
    Exec(ExpandConstant(CurrentFileName), '/verysilent sp-', '', SW_HIDE, ewWaitUntilTerminated, ResultCode);
end;
再改了一下
puddingli 2016-07-04
  • 打赏
  • 举报
回复
引用 2 楼 SXJIAKE 的回复:
之前刚回答过一个问题,说 Inno Setup 可以在每个文件释放结束后调用一个固定格式的函数,如下例子中的 MyAfterInstall 函数。然而我觉得你的问题根本描述不清楚:“另外一个新文件wr.exe”指的是打包进去的文件,还是来自于 A 安装好之后的文件?
[Setup]
AppName=Example
AppVersion=1.0
DefaultDirName=Example
 
[Files]
Source: "C:\test\PackageA.exe"; DestDir: "{tmp}"; AfterInstall: MyAfterInstallA

Source: "C:\test\_ISDEL.EXE";  DestDir: "{app}"
Source: "C:\test\_SETUP.1";    DestDir: "{app}"
Source: "C:\test\_SETUP.DLL";  DestDir: "{app}"
Source: "C:\test\_SETUP.LIB";  DestDir: "{app}"
Source: "C:\test\DISK1.ID";    DestDir: "{app}"
Source: "C:\test\SETUP.INI";   DestDir: "{app}"
Source: "C:\test\SETUP.INS";   DestDir: "{app}"
Source: "C:\test\SETUP.PKG";   DestDir: "{app}"
Source: "C:\test\SETUP.EXE";   DestDir: "{app}"; AfterInstall: MyAfterInstallB

Source: "C:\wrnew\wr.exe";     DestDir: "C:\wr"

[Code]
procedure MyAfterInstallA();
var 
    ResultCode: Integer;
begin
    // 假设安装包 A 的静默参数为 /S
    Exec(ExpandConstant(CurrentFileName), '/S', '', SW_HIDE, ewWaitUntilTerminated, ResultCode);
end;

procedure MyAfterInstallB();
var 
    ResultCode: Integer;
begin
    // 假设安装包 B 的静默参数为 /S
    Exec(ExpandConstant(CurrentFileName), '/S', '', SW_HIDE, ewWaitUntilTerminated, ResultCode);
    // CopyFile('C:\dirB\wr.exe', 'C:\wr\wr.exe');
end;
如果两个包的静默参数相同,你直接写一个函数就可以了。根据你列举的文件名看起来 B 也是一个安装包。那么其实你可以将 B 的主 exe 放在最后释放,并同样书写 AfterInstall 函数去安装 B。然后将新文件打包并释放到你说的那个目录。如果新文件 wr.exe 来自于 B 安装之后,File 段的 wr.exe 就不用打包了,直接用 Code 段注释的那行代码。
哦,我没说的太清楚,我换个问题,这样就清楚了。 我有两个安装包想要用Inno Setup打包到一起,打开后按顺序静默安装它们(因为这两个安装包安装后有相同文件名的文件,后一个安装包要替换前一个的文件) 安装包1的文件(是installshield型安装包) C:\1\_ISDEL.EXE C:\1\_SETUP.1 C:\1\_SETUP.DLL C:\1\_SETUP.LIB C:\1\DISK1.ID C:\1\SETUP.EXE C:\1\SETUP.INI C:\1\SETUP.INS C:\1\SETUP.PKG 安装包2的文件(是Inno Setup做的安装包) C:\2\Install.exe 先安装安装包1,再安装安装包2 那是下面这样写吗?谢谢了

[Setup]
AppName=Example
AppVersion=1.0
DefaultDirName=Example
  
[Files]
Source: "C:\1\_ISDEL.EXE";  DestDir: "{tmp}"
Source: "C:\1\_SETUP.1";    DestDir: "{tmp}"
Source: "C:\1\_SETUP.DLL";  DestDir: "{tmp}"
Source: "C:\1\_SETUP.LIB";  DestDir: "{tmp}"
Source: "C:\1\DISK1.ID";    DestDir: "{tmp}"
Source: "C:\1\SETUP.INI";   DestDir: "{tmp}"
Source: "C:\1\SETUP.INS";   DestDir: "{tmp}"
Source: "C:\1\SETUP.PKG";   DestDir: "{tmp}"
Source: "C:\1\SETUP.EXE";   DestDir: "{tmp}"; AfterInstall: MyAfterInstall1

Source: "C:\2\Install.exe"; DestDir: "{tmp}"; AfterInstall: MyAfterInstall2
  
[Code]
procedure MyAfterInstall1();
var 
    ResultCode: Integer;
begin
    // 假设安装包 A 的静默参数为 /S
    Exec(ExpandConstant(CurrentFileName), '/S', '', SW_HIDE, ewWaitUntilTerminated, ResultCode);
end;
 
procedure MyAfterInstall2();
var 
    ResultCode: Integer;
begin
    // 假设安装包 B 的静默参数为 /S
    Exec(ExpandConstant(CurrentFileName), '/S', '', SW_HIDE, ewWaitUntilTerminated, ResultCode);
end;
「已注销」 2016-07-04
  • 打赏
  • 举报
回复
之前刚回答过一个问题,说 Inno Setup 可以在每个文件释放结束后调用一个固定格式的函数,如下例子中的 MyAfterInstall 函数。然而我觉得你的问题根本描述不清楚:“另外一个新文件wr.exe”指的是打包进去的文件,还是来自于 A 安装好之后的文件?
[Setup]
AppName=Example
AppVersion=1.0
DefaultDirName=Example
 
[Files]
Source: "C:\test\PackageA.exe"; DestDir: "{tmp}"; AfterInstall: MyAfterInstallA

Source: "C:\test\_ISDEL.EXE";  DestDir: "{app}"
Source: "C:\test\_SETUP.1";    DestDir: "{app}"
Source: "C:\test\_SETUP.DLL";  DestDir: "{app}"
Source: "C:\test\_SETUP.LIB";  DestDir: "{app}"
Source: "C:\test\DISK1.ID";    DestDir: "{app}"
Source: "C:\test\SETUP.INI";   DestDir: "{app}"
Source: "C:\test\SETUP.INS";   DestDir: "{app}"
Source: "C:\test\SETUP.PKG";   DestDir: "{app}"
Source: "C:\test\SETUP.EXE";   DestDir: "{app}"; AfterInstall: MyAfterInstallB

Source: "C:\wrnew\wr.exe";     DestDir: "C:\wr"

[Code]
procedure MyAfterInstallA();
var 
    ResultCode: Integer;
begin
    // 假设安装包 A 的静默参数为 /S
    Exec(ExpandConstant(CurrentFileName), '/S', '', SW_HIDE, ewWaitUntilTerminated, ResultCode);
end;

procedure MyAfterInstallB();
var 
    ResultCode: Integer;
begin
    // 假设安装包 B 的静默参数为 /S
    Exec(ExpandConstant(CurrentFileName), '/S', '', SW_HIDE, ewWaitUntilTerminated, ResultCode);
    // CopyFile('C:\dirB\wr.exe', 'C:\wr\wr.exe');
end;
如果两个包的静默参数相同,你直接写一个函数就可以了。根据你列举的文件名看起来 B 也是一个安装包。那么其实你可以将 B 的主 exe 放在最后释放,并同样书写 AfterInstall 函数去安装 B。然后将新文件打包并释放到你说的那个目录。如果新文件 wr.exe 来自于 B 安装之后,File 段的 wr.exe 就不用打包了,直接用 Code 段注释的那行代码。
noodle123 2016-07-02
  • 打赏
  • 举报
回复
用系统函数ShellExecute先静默执行B的setup.exe
然后替换wr.exe文件。
可能难题在于:
1、B安装包多长时间执行完毕?
2、当前目录的频繁切换。
有三个API函数可以运行可执行文件WinExec、ShellExecute和CreateProcess。
改用CreateProcess可以等到B安装包执行完毕后才返回:

摘录:http://bbs.csdn.net/topics/50232175

void main( VOID )
{
STARTUPINFO si;
PROCESS_INFORMATION pi;

ZeroMemory( &si, sizeof(si) );
si.cb = sizeof(si);
ZeroMemory( &pi, sizeof(pi) );

// Start the child process.
if( !CreateProcess( NULL, // No module name (use command line).
"MyChildProcess", // Command line.
NULL, // Process handle not inheritable.
NULL, // Thread handle not inheritable.
FALSE, // Set handle inheritance to FALSE.
0, // No creation flags.
NULL, // Use parent's environment block.
NULL, // Use parent's starting directory.
&si, // Pointer to STARTUPINFO structure.
&pi ) // Pointer to PROCESS_INFORMATION structure.
)
{
ErrorExit( "CreateProcess failed." );
}

// Wait until child process exits.
WaitForSingleObject( pi.hProcess, INFINITE );

// Close process and thread handles.
CloseHandle( pi.hProcess );
CloseHandle( pi.hThread );
}


这篇帖子里还有许多方法,可以参考试验。

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧