Createprocess 启动一个进程 (*)

目录

c++ - CreateProcess 可以启动一个进程,但是QProcess 不能……为什么?

在QT中用Createprocess打开cmd执行命令行

-------------------------------------

要点:

c++ - CreateProcess can start a process, but QProcess cannot... why? - Stack Overflow

//startDetached(qsExePath, QStringList()); 这个 startDetached() 的重载版本
//支持路径:空格,中文路径

         
QProcess process;
QString qsExePath = "C:\\Program Files (x86)\\Some Company\\SomeApp.exe";
bool bStarted = process.startDetached(qsExePath, QStringList());

======================

在QT中用Createprocess打开cmd执行命令行

void 类名::exceCmd(QString program)
{
    qDebug()<< "*********************"<<program;
    STARTUPINFO si; //一些必备参数设置
    memset(&si, 0, sizeof(STARTUPINFO));
    si.cb = sizeof(STARTUPINFO);
    si.dwFlags = STARTF_USESHOWWINDOW;
    si.wShowWindow = SW_HIDE;
    PROCESS_INFORMATION pi; //必备参数设置结束
    if (CreateProcess(NULL,(LPWSTR)program.utf16(),NULL,NULL,TRUE,NULL,NULL,NULL,&si,&pi))
    {
        qDebug()<<program/*<<" "<<si<<" "<<pi*/;
    }
    else
    {
        qDebug()<<"failed!"<<::GetLastError();
    }
}

https://blog.csdn.net/Dopamine_Dong/article/details/111567062

c++ - CreateProcess 可以启动一个进程,但是QProcess 不能……为什么?

我正在编写一个需要启动其他应用程序的 Windows QT 应用程序。如果我使用以下窗口调用一切正常:

QString qsExePath = "C:\\Program Files (x86)\\Some Company\\SomeApp.exe";
QString qsCommandLine = "";


DWORD dwLastError = 0;
STARTUPINFO startupInfo;
ZeroMemory(&startupInfo, sizeof(startupInfo));
startupInfo.cb = sizeof(startupInfo);
startupInfo.dwFlags = STARTF_USESHOWWINDOW;
startupInfo.wShowWindow = (WORD)1;

PROCESS_INFORMATION processInfo;
ZeroMemory(&processInfo, sizeof(processInfo));

if (CreateProcess((TCHAR*)(qsExePath.utf16()), (TCHAR*)(qsCommandLine.utf16()), 
    NULL, NULL, FALSE, 0, NULL, NULL, 
    &startupInfo, &processInfo))
{
    CloseHandle(processInfo.hProcess);
    CloseHandle(processInfo.hThread);
}
else
{
    dwLastError = GetLastError();
}

但是,如果我使用以下 QT 调用,它不起作用并且失败并出现 QProcess::Unknown 错误。

QProcess process;
bool bStarted = process.startDetached(qsExePath);
qDebug()  << process.error();   

如果将 SomeApp.exe 复制到我的 %TMP% 目录并相应地更改 qsExePath,我可以让 QProcess 工作,所以这显然是某种权限错误。我不明白为什么……如果真的是权限,我的 CreateProcess 窗口调用不应该失败吗?

最佳答案

您的路径中有空格。您正在调用采用单个参数的 QProcess.startDetached() 的重载版本,因此它将其解释为要执行的完整命令行。因此,请尝试将路径用引号引起来,否则它会认为“C:\Program”是要执行的程序,而其他所有内容都是参数,这是错误的:

QString qsExePath = "\"C:\\Program Files (x86)\\Some Company\\SomeApp.exe\"";
bool bStarted = process.startDetached(qsExePath);

或者,调用 startDetached() 的其他重载版本之一,让它在内部为您计算出必要的引用:

//startDetached(qsExePath, QStringList()); 这个 startDetached() 的重载版本
//支持路径:空格,中文路径
QProcess process;
QString qsExePath = "C:\\Program Files (x86)\\Some Company\\SomeApp.exe";
bool bStarted = process.startDetached(qsExePath, QStringList());

关于c++ - CreateProcess 可以启动一个进程,但是QProcess 不能……为什么?,我们在Stack Overflow上找到一个类似的问题:  https://stackoverflow.com/questions/14637539/ 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值