如何通过C ++启动explorer.exe?

时间:2009-05-14 20:00:03

标签: c++ winapi createprocess

我正在尝试以编程方式启动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

3 个答案:

答案 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注册表项,这会阻止您在重新启动资源管理器时控制