C++ Qt5:使用QProcess::StartDetailed调用.bat文件';在System32中找不到程序
我有一个带有按钮的QtGUI小程序,它启动一个.bat文件 调用.bat的重要部分是: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
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,你的建议确实有效!请随意将其作为答案发布,我会将其标记为解决方案。