卸载程序为什么双击它执行的时候能删除自身,用快捷方式执行就不能

求助:卸载程序为什么双击它执行的时候能删除自身,用快捷方式执行就不能?
本帖最后由 VisualEleven 于 2014-08-19 10:35:02 编辑
我的卸载程序,删除自身用的是这个办法:

。。。前面的卸载部分,删除快捷方式。。。清理注册表等等。。。

	SetPriorityClass(GetCurrentProcess(), REALTIME_PRIORITY_CLASS);
SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_TIME_CRITICAL);
SHChangeNotify(SHCNE_DELETE, SHCNF_PATH, _pgmptr, NULL);
char szCommandLine[MAX_PATH + 10];
sprintf(szCommandLine, "/c del /q %s", _pgmptr);
ShellExecute(NULL, "open", "cmd.exe", szCommandLine, NULL, SW_HIDE);
ExitProcess(0);


结果发现:如果在程序文件夹中双击这个卸载程序,执行它,发现是可以删除自身的。

但是从“开始菜单”里的快捷方式启动执行,却删除不了自身,可是快捷方式确实又是指向这一个卸载程序。(调试发现,到了最后一步ShellExecute的时候,szCommandLine的值确实是:"/c del /q c:\Program Files\zywb\Uninstall.exe”,没有错)

为什么直接执行它,可以删除自身,用指向它的快捷方式来执行它,却删除不了自身的呢?请问这个怎么解决?
------解决方案--------------------
1.但是从“开始菜单”里的快捷方式启动执行,却删除不了自身
这种情况你可以用GetLastError()获得一下错误码试试

2.只是第一种情况下,SHChangeNotify()将文件隐藏起来,不显示而已,刷新一下又显示出来了
好像我看过说是设置了SHCNE_DELETE标记的文件,会在重新启动后删除

3.发现把Uninstall.exe拷到有的文件夹中,可以删除自己,拷到有的文件夹中,就不能
这应该跟文件夹没有关系,说明就算是在同一个文件夹中,也会有时可以,有时不可以

4.正确的办法应该是要Uninst.exe运行后,释放一个真正起作用的exe到系统的临时目录,然后这个exe来执行所有的删除操作,这样就能连同Uninst.exe及其所在文件夹全部删除了,请参考应用程序启动后修改自身EXE文件或自删除EXE文件
------解决方案--------------------
1、给del加上 /f参数,强制删除;
2、之所以从快捷方式删除不了,是因为路径问题,比如从开始菜单点击卸载快捷方式,当前工作目录就不是exe所在目录,此时应该传入完整路径。