问题
在批处理文件的一部分(类型,请参阅额外信息)中,我需要重新启动资源管理器,因此我使用了久经考验的方法
taskkill /f /im explorer.exe >nul
explorer.exe
然后发生这种情况
explorer.exe
已成功终止explorer.exe
已启动(见图 2),但只打开一个资源管理器窗口,我无限期地留下了(见图 1)
然后,我只能通过从任务管理器启动新任务来正确重新启动资源管理器,因为我假设Win + R
它是资源管理器的一部分。
额外的信息
现在,当我从使用 WinRAR 创建的自动执行 SFX 存档运行批处理文件时,我说“有点”。因此,在执行时,存档的内容被提取到%temp%
一个用户定义的文件(通常是引导程序,在本例中是我的批处理文件)在成功提取后运行。
到目前为止,我已经推断出
explorer.exe
绝对是被完全杀死了。- 批处理文件肯定被正确调用和执行,因为它运行并且脚本中的所有其他内容都按设计工作,除了开始的行
explorer.exe
- 重新启动资源管理器的命令不是“时间错误”或任何东西,因为我尝试过延迟它。
- 当从存档中手动提取时,批处理文件可以完美运行,因此压缩或提取过程没有问题。
- 即使使用像
start explorer.exe | cmd.exe
资源管理器这样的命令也不能正确重启,所以.bat
文件绝对不是问题。
我可以确认它适用于 Windows XP 和 Windows 7 x86,但不适用于 Windows 7 x64(这是我的系统)。
地位
目前,我对 WinRAR 持怀疑态度,因为我已经证明代码本身可以工作。因此,我正在使用不同版本的 WinRAR 创建自执行 SFX。到目前为止,我已经尝试过以下版本:
- 4.11 x86
- 4.11 x64
- 4.20b3 x86
- 4.20b3 x64
并且每次都有相同的结果。
我昨天向 dev@rarlab.com 提交了一个错误报告,今天早上得到了 Eugene Roshal 本人的回复
您好,SFX 模块使用 ShellExecuteEx 启动设置应用程序。通常它运作良好。我不知道为什么 Explorer 决定切换到窗口模式。现在我建立了一个小的独立程序
#include <windows.h>
void main()
{
SHELLEXECUTEINFO si;
memset(&si,0,sizeof(si));
si.cbSize=sizeof(si);
si.lpFile="test.bat";
si.nShow=SW_SHOWNORMAL;
ShellExecuteEx(&si);
}
它运行 test.bat 的内容与您的示例中的内容相同。该程序显示与 WinRAR SFX 完全相同的行为,因此资源管理器在窗口中启动。
和今天早上的第二封电子邮件
对不起,现在没有建议。我用 CreateProcess 替换了 ShellExecuteEx
#include <windows.h>
void main()
{
STARTUPINFO si;
PROCESS_INFORMATION pi;
memset(&si,0,sizeof(si));
si.cb=sizeof(si);
CreateProcess(NULL,"test.bat",NULL,NULL,TRUE,0,NULL,NULL,&si,&pi);
}
但结果是一样的。我尝试将其他 SW_ 标志(如 SW_SHOWDEFAULT 或 SW_RESTORE)与 ShellExecuteEx 一起用作“open”和“explore”lpVerb,但它没有帮助。现在我不明白这种窗口模式与桌面模式背后的逻辑。
我意识到前景很严峻,但我希望这对某人有所帮助..
证明/证据
链接到演示此的 SFX 存档,如果有人想要的话: https ://dl.dropbox.com/u/27573003/Social%20Distribution/restart-explorer.exe
您可能会注意到,我在 VM 中运行命令(用 表示
VMwareTray.exe
),但这不是由 VM 引起的冲突。我已经在我自己的主机系统(相同的操作系统)上测试了完全相同的文件并且得到了相同的结果。
更新
REG ADD
在完全不同的项目中使用时,我遇到了类似的“在 SFX 存档之外工作但不是来自一个”的问题。我只是不认为 SFX 档案与批处理文件配合得很好。