我在标准dll中编写C ++函数以在卸载期间删除文件夹中的文件。这些文件在某些时候由应用程序添加。
我使用DeleteFile逐个删除文件。 DeleteFile返回ERROR_ACCESS_DENIED错误。在REMOVE =" ALL"。
之后,在InstallSalidate之后,从InstallShiel卸载中调用DeleteFile作为自定义操作。我为何获得ERROR_ACCESS_DENIED的任何想法?我作为管理用户卸载。
InstallShield项目是基本的MSI项目安装。我使用的是InstallShield Spring 2012专业版。
从正常测试应用程序(Windows窗体应用程序)调用时,Delete函数可以正常工作。 Dll是一个Win32 DLL。
答案 0 :(得分:1)
这些文件的类型和位置在哪里?如果要将文件视为用户数据,我根本不会删除它们。
尽可能使用MSI RemoveFile table删除安装或卸载文件。使用自定义操作太容易出错且耗时。
答案 1 :(得分:1)
删除文件表将起作用,但是如果调用DLL的.exe正在使用中则不行。
如果是这种情况,您可以使用条件REMOVEALL=TRUE
进行自定义操作,然后直接执行该操作。
您需要先将其放在InstallExecute序列中,以便它以静默模式运行。
例如,在VBScript中:
Dim oShell : Set oShell = CreateObject("WScript.Shell")
oShell.Run "taskkill /im exeprocessname.exe", , True
答案 2 :(得分:0)
导致此问题的原因是被调用函数的dll位于要删除的文件夹中。