我正在尝试以编程方式启动explorer.exe,但我没有运气。
这是我的代码:
cout << pName << "died, lets restart it." << endl;
STARTUPINFO startupInfo = {0};
startupInfo.cb = sizeof(startupInfo);
PROCESS_INFORMATION processInformation;
if(CreateProcess(pName, NULL, NULL, NULL, false, NORMAL_PRIORITY_CLASS, NULL, NULL, &startupInfo, &processInformation) == 0){
cout << "Error starting " << pName << ": " << GetLastError() << endl;
}
和pName是explorer.exe
有人可以告诉我我做错了什么吗?我收到错误代码'2',即ERROR_FILE_NOT_FOUND
答案 0 :(得分:4)
第一个参数是应用程序名称;第二个是命令行。尝试将“explorer.exe”指定为第二个参数。
请参阅此MSDN article:
lpApplicationName [in,optional]
要执行的模块的名称。 该模块可以是基于Windows的 应用。它可以是其他类型 模块(例如,MS-DOS或 OS / 2)如果适当的子系统是 可在本地计算机上使用。
字符串可以指定完整路径 和要执行的模块的文件名 或者它可以指定部分名称。在 部分名称的情况, 函数使用当前驱动器和 当前目录完成 规格。 该功能不会 使用搜索路径。这个参数 必须包含文件扩展名; 没有默认的扩展名。
答案 1 :(得分:3)
你可能应该尝试“ShellExecuteEx”。此功能允许您指定文件或文件夹和动词,用于说明如何处理它。如果您使用“explore
”作为动词,它将使用给定的文件夹打开Windows资源管理器。
答案 2 :(得分:0)
很难找到有关如何可靠重新启动Windows资源管理器的相关信息。在64位Windows 7/8上,ShellExecute方法无法正常工作,导致文件复制和图标叠加等问题完全破坏。
最可靠的方法似乎是使用stdlib.h系统调用:
system("start explorer");
如果您尝试关闭并重新启动资源管理器,则可能需要以编程方式禁用AutoRestartShell注册表项,这会阻止您在重新启动资源管理器时控制。