当前位置: 首页 > 知识库问答 >
问题:

使用Inno安装程序在安装过程中删除和注销DLL文件

袁成化
2023-03-14

在我的< code>[Files]部分中,我有以下内容:

; Database password decryption (for PTS importing)
Source: "..\..\..\PTSTools\PTSTools\bin\x86\Release\PTSTools.dll"; \
    DestDir: "{app}"; \
    DestName: "PTSTools_x86.dll"; Flags: ignoreversion
Source: "..\..\..\PTSTools\PTSTools\bin\x64\Release\PTSTools.dll"; \
    DestDir: "{app}"; \
    DestName: "PTSTools_x64.dll"; Flags: ignoreversion; Check: IsWin64

[运行]部分我有:

Filename: "{dotnet40}\regasm.exe"; Parameters: "PTSTools_x86.dll /codebase"; \
    WorkingDir: "{app}"; Flags: runhidden
Filename: "{dotnet4064}\regasm.exe"; Parameters: "PTSTools_x64.dll /codebase"; \
    WorkingDir: "{app}"; Flags: runhidden; Check: IsWin64

最后,在[UninstallRun]部分,我有:

Filename: {dotnet40}\regasm.exe; Parameters: /u PTSTools_x86.dll; \
     WorkingDir: {app}; \
    Flags: runhidden
Filename: {dotnet4064}\regasm.exe; Parameters: /u PTSTools_x64.dll;  \
    WorkingDir: {app}; \
    Flags: runhidden; Check: IsWin64;

现在,在这个版本的程序中,我已经将这两个DLL文件的功能合并到另一组DLL文件中:

Source: "..\..\..\MSAToolsLibrary\MSAToolsLibrary\bin\x86\Release\MSAToolsLibrary.dll"; \
    DestDir: "{app}"; DestName: "MSAToolsLibrary_x86.dll"; Flags: ignoreversion
Source: "..\..\..\MSAToolsLibrary\MSAToolsLibrary\bin\x64\Release\MSAToolsLibrary.dll"; \
    DestDir: "{app}"; DestName: "MSAToolsLibrary_x64.dll"; Flags: ignoreversion; \
    Check: IsWin64

因此,不再需要 PTSTool DLL 文件。现在,我知道如果它们存在,我可以简单地删除它们:

[InstallDelete]
Type: files; Name: "{app}\PTSTools_x64.dll"
Type: files; Name: "{app}\PTSTools_x86.dll"

但据我所知,这不会像在 [卸载运行] 中那样触发 DLL 文件的注销。

我该怎么做?在安装过程中删除并注销DLL文件(如果存在)?

共有1个答案

储国发
2023-03-14

我不认为您可以使用标准部分轻松实现这一点。

< code>[Run]条目仅出现在< code>[InstallDelete]之后。而在删除DLL之前,您需要反过来先取消注册。

所以你需要 Pascal 脚本。

BeforeInstall参数添加到[InstallDelete]并取消注册DLL编程。

或者将安装参数添加到 [运行] 并以编程方式删除 DLL。

后者对您来说工作量较小,因为您已经知道如何使用< code>[Run]来注册。

[Run]
Filename: {dotnet40}\regasm.exe; Parameters: /u PTSTools_x86.dll; \
    WorkingDir: {app}; \
    Check: FileExists(ExpandConstant('{app}\PTSTools_x86.dll')); \
    AfterInstall: DoDeleteFile(ExpandConstant('{app}\PTSTools_x86.dll')); \
    Flags: runhidden
Filename: {dotnet4064}\regasm.exe; Parameters: /u PTSTools_x64.dll;  \
    WorkingDir: {app}; \
    Check: IsWin64 and FileExists(ExpandConstant('{app}\PTSTools_x64.dll')); \
    AfterInstall: DoDeleteFile(ExpandConstant('{app}\PTSTools_x64.dll')); \
    Flags: runhidden
[Code]

{ Cannot use built-in DeleteFile directly in AfterInstall as it's a function,
{ not a procedure. And this way we can add some error handling too. }
procedure DoDeleteFile(FileName: string);
begin
  if DeleteFile(FileName) then
  begin
    Log(Format('"%s" deleted', [FileName]));
  end
    else
  begin
    MsgBox(Format('Failed to delete "%s"', [FileName]), mbError, MB_OK);
  end;
end;
 类似资料:
  • 另请参见: 使用Inno Setup在安装期间删除和取消注册DLL文件 Inno Setup:如何自动卸载以前安装的版本? 在我的Inno安装脚本的[Files]部分,我有这样一行: 应用程序的更新版本不再使用此DLL。在安装新版本时,我想做的是减少此DLL的共享文件锁计数,如果为零,则注销并删除它。 最简单的方法是告诉用户在更新之前卸载应用程序的早期版本,但这意味着各种配置设置也将被删除,用户必

  • 我有Inno安装程序(在我之前写的),它提取了一组VSTO文件并开始安装VSTO MS Office插件。它有一个问题,当将VSTO文件提取到临时文件夹并启动时,它会立即显示完成按钮。如果用户单击它,临时文件将被删除,并在中开始实际安装VSTO插件,然后导致“文件未找到”错误。我应该解决这个问题(理想情况下,只有当它生成的完成执行时,Inno安装程序中的完成按钮才会出现)。 VSTO包本身(“应用

  • 在Inno设置帮助中: dontcreatekey 当指定此标志时,如果用户系统中不存在该项,安装程序将不会尝试创建该项或任何值。如果该项不存在,则不会显示错误消息。 通常,此标志与标志结合使用,用于在卸载期间删除密钥但在安装期间不创建它们。 我的程序在当前用户自动启动部分下创建一个注册表值(类型为),但前提是用户从设置屏幕显式执行此操作。 我想让卸载程序清除这个条目,所以我在Inno安装项目中添

  • 我想首先将现有文件“我的程序旧”重命名为“我的程序v2”,但前提是“我的程序v2”还不存在。 然后我想将“我的程序”重命名为“我的程序旧”,但前提是“我的程序旧”不存在。 然后我想从安装程序安装‘我的程序',但前提是’我的程序‘还不存在。 我将非常感谢任何指导!

  • 如果操作系统是64位,我想安装一个32位的DLL到文件夹和64位的DLL到文件夹并分别注册它们。如果是32位操作系统,我只想将文件复制到正常程序文件夹并注册。 如何在Inno安装程序中执行此操作?64位DLL也会被64位程序注册吗? 这是我到目前为止的代码。它在 32 位操作系统上工作正常,但在 64 位操作系统上,它会转储 中的两组文件。 我已经看过示例,但它告诉如何进行32位或64位安装,而不

  • 我下载了Visual Studio Ultimate CTP 6的完整ISO。安装程序达到了90%左右,通过进度条进行测量,然后就卡在那里了。Superfetch、反恶意软件保护和其他后台进程的活动频繁,但进度条仍然死气沉沉。最终,后台任务活动在20分钟后消退,但进度条仍不动。 便宜的技巧:打开一个记事本窗口,并将其左边缘定位,使其完美地标记进度条的当前位置。如果进度条在大约一个小时内没有移动过记