花了两天的时间,终于发现此问题的原因了.
问题描述:
利用NSIS写的卸载程序,但是,经过多次的安装卸载以后发现,无法无法卸载程序了.所有利用NSIS生成的卸载程序都无法卸载了.
问题细分:
问题背景知识:
NSIS卸载程序每次卸载的时候,先是拷贝自己到一个临时文件夹C:/Documents and Settings/userXXXXX/Local Settings/Temp/~nsu.tmp/
名字一般是Au_.exe,或者是Bu_.exe,。。。一直可以到Zu_.exe。假设上一步骤生成的是Au_.exe.然后uninstall.exe调用Au_.exe _?=$(path),注意_?=$(path)为Au_.exe的参数,&(path)为uninstall所在的的文件夹。意思是把当前目录设置为uninstall所在的文件夹。
NSIS这么做主要是利用Au_.exe最后来删除自己。
其中有个细节就是删除程序运行开始会先生产一个临时的文件,名字是Au_.exe,,,,,,,Zu_.exe。
规则如下:
uninstall.exe先是尝试删除上面提到的临时目录下已经有Au_.exe,Bu_.exe,,,,,一直到Zu.exe的文件,然后去生成一个Xu_.exe,X为A~~Z的字母,优先级从高到低。
说说我的问题:
我在出现了nsis error launching installer的提示后,发现上面提到那个临时文件夹里面的有26个文件依次为Au_.exe,,,,,Zu.exe也就是26个字母完全用完了。所有nsis无法在生产临时的卸载文件,导致这个错误出现。
利用Procmon monitor来监控卸载的时候进行了什么操作,发现其他nsis制作的卸载程序刚开始都回删除Au_.exe,,,Zu_.exe的临时文件,但是在删除,用我的nsis制作的卸载文件生成的临时Au_.exe,或者是Bu_.exe时无法进行删除(返回结果都是can not delete)。
问题的原因就在于此了。
问题出现在临时文件的生成上,再进一步,为什么前面的临时文件(Au_.exe)没有删除呢?
经过一天的查找,无疑中发现是因为,uninstall.exe这个文件因为是从光盘拷贝过来的,所有,每次卸载生产的文件也是只读属性的,所有在下一次的时候,是无法把他删除的,这也算是nsis的一个bug吧!
暂无评论内容