QProcess打开MFC生成的exe进程,附带命令行参数

1、QProcess遇见的问题

    QProcess* process = new QProcess(this);
    process->start("E:/bin/Release/temp/test.exe");   //无法启动
    QString path = "E:/bin/Release/temp/test.exe";
    process->start(path);   //无法启动
    process->startDetached(path);   //可以启动
    QProcess::startDetached(path, QStringList(path));   //可以启动

    //当程序路径中含有空格的时候,仅设置程序路径program是无法启动的。还需将程序路径传递给参数arguments。
    QString path = "E:/bin/Release/temp/test v1_0_0.exe";
    process->start(path);   //无法启动
    process->startDetached(path);   //无法启动
    process->startDetached(path, QStringList(path));   //可以启动
    QProcess::startDetached(path, QStringList(path));   //可以启动


    process->setProgram("E:/bin/Release/temp/test.exe");
    process->setArguments(QStringList("E:/bin/Release/temp/test.exe"));
    process->start();   //无法启动

2、启动MFC编译的exe程序

QString appDir = QApplication::applicationDirPath();
		QString appPath = appDir + "/DataTool.exe";

		QFile qAppPath(appPath);
		if (!qAppPath.exists())
		{
    
    
			wstring sMsg = appPath.toStdWString() + L"程序不存在,请进行检查!";
			QMessageBox(sMsg);

			return nullptr;
		}

		QString strName = "name";
		strAPIUrl = "&" + strName ;
		
		QString strPassword = "password";
		strPrjCode = "&" + strPassword ;

		QStringList arguments;
		arguments.append(appPath);
		arguments.append(strName );
		arguments.append(strPassword );
		
		QProcess::startDetached(appPath, arguments);

MFC程序对命令行进行字符串拆分即可使用参数。

BOOL CDataToolApp::InitInstance()
{
    
    
	// 如果一个运行在 Windows XP 上的应用程序清单指定要
	// 使用 ComCtl32.dll 版本 6 或更高版本来启用可视化方式,
	//则需要 InitCommonControlsEx()。  否则,将无法创建窗口。
	INITCOMMONCONTROLSEX InitCtrls;
	InitCtrls.dwSize = sizeof(InitCtrls);
	// 将它设置为包括所有要在应用程序中使用的
	// 公共控件类。
	InitCtrls.dwICC = ICC_WIN95_CLASSES;
	InitCommonControlsEx(&InitCtrls);

	CWinApp::InitInstance();

	g_hDllResInstance = theApp.m_hInstance;

	AfxEnableControlContainer();

	// 创建 shell 管理器,以防对话框包含
	// 任何 shell 树视图控件或 shell 列表视图控件。
	CShellManager *pShellManager = new CShellManager;

	// 激活“Windows Native”视觉管理器,以便在 MFC 控件中启用主题
	CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerWindows));

	// 标准初始化
	// 如果未使用这些功能并希望减小
	// 最终可执行文件的大小,则应移除下列
	// 不需要的特定初始化例程
	// 更改用于存储设置的注册表项
	// TODO: 应适当修改该字符串,
	// 例如修改为公司或组织名
	SetRegistryKey(_T("应用程序向导生成的本地应用程序"));

	LPTSTR lpCmdLine = GetCommandLine();
	std::vector<CString> vecArgs;
	GetStrArrayFromString(_T('&'), vecArgs, lpCmdLine);
	if (vecArgs.size() > 1)
	{
    
    
		vecArgs.erase(vecArgs.begin());
	}
	if (vecArgs.size() != 2)
	{
    
    
		AfxMessageBox(_T("传入参数数量不正确,请进行检查!"));
		return FALSE;
	}
	
	CString strName = vecArgs.at(0);
	strName .Trim();
	CString strPassword = vecArgs.at(1);
	strPassword .Trim();
	
	CDataToolDlg dlg;
	m_pMainWnd = &dlg;
	INT_PTR nResponse = dlg.DoModal();
	if (nResponse == IDOK)
	{
    
    
		// TODO: 在此放置处理何时用
		//  “确定”来关闭对话框的代码
	}
	else if (nResponse == IDCANCEL)
	{
    
    
		// TODO: 在此放置处理何时用
		//  “取消”来关闭对话框的代码
	}

	// 删除上面创建的 shell 管理器。
	if (pShellManager != NULL)
	{
    
    
		delete pShellManager;
	}

	// 由于对话框已关闭,所以将返回 FALSE 以便退出应用程序,
	//  而不是启动应用程序的消息泵。
	return FALSE;
}

猜你喜欢

转载自blog.csdn.net/m0_37251750/article/details/130871317