C++ Qt5:使用QProcess::StartDetailed调用.bat文件';在System32中找不到程序

C++ Qt5:使用QProcess::StartDetailed调用.bat文件';在System32中找不到程序,c++,windows,qt,batch-file,C++,Windows,Qt,Batch File,我有一个带有按钮的QtGUI小程序,它启动一个.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::Defau

我有一个带有按钮的QtGUI小程序,它启动一个.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");
    }
}
我打算调用位于
C:\Windows\System32\psshutdown.exe
,当然也在
路径中的

出于测试目的,我将其放入.bat中:

cd C:\Windows\System32
psshutdown
PAUSE
单独调用.bat文件时,似乎可以找到程序并打印有关它的信息,但当我使用按钮调用程序时,它找不到
psshutdown.exe

结果概述:

使用Qt程序调用.bat:

双击调用.bat(预期结果):

echo%path%
添加到.bat时,两个版本中的路径似乎都打印正常。你知道会出什么问题吗

这已经在两台不同的计算机上用Qt5.5和5.7调试和发布模式进行了测试


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

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

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

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

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

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上仅具有
System32
的32位应用程序,以及64位Windows上具有64位
System32
和32位
SysWOW64
的64位应用程序

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

第三个IF条件是64位窗口上的64位应用程序访问32位
SysWOW64

另一种解决方案是使用64位文件管理器(如Windows资源管理器)将文件
psshutdown.exe
复制到两个目录中

%SystemRoot%\System32
%SystemRoot%\SysWOW64

想知道在批处理文件中指定可执行文件的完整路径时会发生什么。C:\windows\system32\psshutdown.exehollo@Squashman,仍未找到。我发现的一个解决方法是,如果我将可执行文件复制到同一文件夹,调用psshutdown,但这是一个快速而肮脏的解决方案。如果你在64位系统上运行32位可执行文件,你可能会成为错误的受害者。尝试将
psshutdown.exe
复制到
C:\WINDOWS\SysWOW64
中,如果复制后没有遇到错误,则情况就是这样。你的代码应该可以工作!您是否尝试过启动任何其他exe而不是psshutdown.exe?或者system32之外的任何其他exe?谢谢@Mike,你的建议确实有效!请随意将其作为答案发布,我会将其标记为解决方案。