Qt5:使用QProcess :: startDetached调用.bat文件在System32中找不到程序

我有一个小button的Qt GUI程序,启动一个.bat文件。

调用.bat的重要部分是这样的:

void MainWindow::on_pushButton_clicked() { int r = QMessageBox::warning(this, tr("Shutdown System"), tr("Do you want to close the program and the system?"), QMessageBox::Yes | QMessageBox::Default, QMessageBox::No, QMessageBox::Cancel | QMessageBox::Escape); if (r == QMessageBox::Yes){ QProcess::startDetached("cmd /C shutdown_all.bat"); } } 

我打算打电话PSShutdown ,位于C:\Windows\System32\psshutdown.exe ,当然在PATH

我把它放在.bat文件中用于testing目的:

 cd C:\Windows\System32 psshutdown PAUSE 

当单独调用.bat文件时,似乎find了有关它的程序和打印信息,但是当我使用该button调用程序时,找不到psshutdown.exe

捕获结果:

用Qt程序调用.bat: .bat从Qt程序中调用

双击调用.bat(预期结果): 在这里输入图像说明

在向.bat添加echo %PATH%时,path也似乎在两个版本中均打印成功。 任何想法可能是错的?

这已经在两个不同的计算机上用Qt 5.5和5.7,debugging和发布模式进行了testing。

如果需要的话,我可以提供完整的源代码,但这只是一个Qt Widgets应用程序,添加了一个button,使用Qt Creator中的模板。

Solutions Collecting From Web of "Qt5:使用QProcess :: startDetached调用.bat文件在System32中找不到程序"

psshutdown.exe是一个通常在Windows上不存在的可执行文件。 它是Windows Sysinternals的一个工具,需要下载并手动复制到任何目录。

在64位Windows 64位应用程序中访问%SystemRoot%\System32的64位应用程序和动态链接库。

但是,Windows 文件系统重定向器将运行在64位Windows上的x86应用程序重定向到32位系统目录%SystemRoot%\SysWOW64用于访问%SystemRoot%\System32以运行可执行文件或加载DLL。

一种解决方案是在批处理文件中使用以下代码

 if exist %SystemRoot%\System32\psshutdown.exe ( %SystemRoot%\System32\psshutdown.exe ) else if exist %SystemRoot%\Sysnative\psshutdown.exe ( %SystemRoot%\Sysnative\psshutdown.exe ) else if %SystemRoot%\SysWOW64\psshutdown.exe ( %SystemRoot%\SysWOW64\psshutdown.exe ) else ( echo Error: Can't find psshutdown.exe in system directory of Windows. pause ) 

这个批处理代码独立于编译Qt应用程序,作为32位和64位Windows的x64或x86应用程序,独立于以前复制到哪个系统目录psshutdown.exe

第一个IF条件适用于32位Windows上的32位应用程序,只有System32和64位Windows 64位System32和32位SysWOW64上的64位应用程序。

第二个IF条件适用于64位Windows上的32位应用程序,用于访问64位System32

第三个IF条件适用于64位Windows上的64位应用程序,用于访问32位SysWOW64

另一个解决方案是将文件psshutdown.exe与Windows资源管理器这样的64位文件管理器复制到两个目录中

 %SystemRoot%\System32 %SystemRoot%\SysWOW64