卸载自定义操作 (InstallShield) 期间删除文件时出错

Posted

技术标签:

【中文标题】卸载自定义操作 (InstallShield) 期间删除文件时出错【英文标题】:Error Deleting Files during Uninstall Custom Action (InstallShield) 【发布时间】:2014-07-22 23:22:54 【问题描述】:

我正在标准 dll 中编写 C++ 函数,以在卸载期间删除文件夹中的文件。这些文件是由应用程序在某个时候添加的。

我正在使用 DeleteFile 一个一个地删除文件。 DeleteFile 正在返回 ERROR_ACCESS_DENIED 错误。在安装验证之后,当 REMOVE="ALL" 时,从 InstallShiel 卸载中调用 DeleteFile 作为自定义操作。

知道为什么我会收到 ERROR_ACCESS_DENIED 吗?我正在以管理用户身份卸载。

InstallShield 项目是一个基本的 MSI 项目安装。我正在使用 InstallShield Spring 2012 专业版。

当从普通测试应用程序(Windows 窗体应用程序)调用时,Delete 函数可以正常工作。该 Dll 是一个 Win32 dll。

【问题讨论】:

【参考方案1】:

删除文件表会起作用,但如果调用 DLL 的 .exe 正在使用中,则不会。 如果是这种情况,您可以使用条件REMOVEALL=TRUE 放置自定义操作,然后简单地终止进程。

您需要将它放在 InstallExecute 序列的前面,以便它以静默模式运行。

例如,在 VBScript 中:

Dim oShell : Set oShell = CreateObject("WScript.Shell")
oShell.Run "taskkill /im exeprocessname.exe", , True

【讨论】:

【参考方案2】:

这些是什么类型的文件,它们位于何处?如果这些文件被视为用户数据,我根本不会删除它们。

尽可能使用 MSI 的RemoveFile table 在安装或卸载时删除文件。使用自定义操作太容易出错且耗时。

【讨论】:

【参考方案3】:

这个问题是因为被调用函数的dll在被删除的文件夹中。

【讨论】:

以上是关于卸载自定义操作 (InstallShield) 期间删除文件时出错的主要内容,如果未能解决你的问题,请参考以下文章

重大更新时的 InstallShield 自定义操作

InstallShield LE:自定义卸载

使用 Installshield 和用户对话框卸载 MSI 时的特权提升

卸载期间自定义操作不起作用

JavaScript 不能在 InstallShield Express 中运行?

自定义操作中的第三方 exe - installshield