欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

通过命令行参数创建进程来启动exe程序

程序员文章站 2022-05-12 21:30:16
...

在基于对话框的MFC项目的.cpp文件中,可以对函数InitInstance()修改来进行执行不同的命令行参数:

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

	CWinApp::InitInstance();


	AfxEnableControlContainer();

	AfxOleInit();
	AfxInitRichEdit2();

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

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

	LPTSTR lpCmdLine = GetCommandLine();
	CStringArray saArgs;
	CmdLineToArr(lpCmdLine, saArgs);
	
	if (saArgs.GetSize() > 0 && saArgs.GetAt(0).CompareNoCase(_T("eeee")) == 0)
	{
		CMyDlg1 dlg(saArgs);
		m_pMainWnd = &dlg;
		INT_PTR nResponse = dlg.DoModal();
		if (nResponse == IDOK)
		{
			// TODO: 在此放置处理何时用
			//  “确定”来关闭对话框的代码
		}
		else if (nResponse == IDCANCEL)
		{
			// TODO: 在此放置处理何时用
			//  “取消”来关闭对话框的代码
		}
	}
	else
	{
		CMyDlg2 dlg(saArgs);
		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;
}

// 处理命令行参数并转化为数组进行存储
void CmdLineToArr(LPTSTR lpCmdLine, CStringArray& saArgv)
{
	CString strTemp, str;
	strTemp = lpCmdLine;
	strTemp.Trim();

	int nPos = strTemp.Find(_T(' '));
	while(nPos >= 0)
	{
		str = strTemp.Left(nPos+1);
		str.TrimRight();

		if(str.GetLength() > 0)
		{
			//如果参数的第一个字符是",那么向后找另一个",之间的是同一个参数
			if(str[0] == _T('"'))
			{
				int nPos1 = strTemp.Find(_T('"'), 1);
				if(nPos1 > 0)
				{
					nPos = nPos1;
					str = strTemp.Left(nPos);
					str = str.Mid(1);
				}
			}

			saArgv.Add(str);
		}

		strTemp = strTemp.Mid(nPos+1);
		nPos = strTemp.Find(_T(' '));
	}

	strTemp.Trim();
	if(strTemp.GetLength() > 0)
	{
		if( (strTemp[0] == _T('"')) && (strTemp[strTemp.GetLength() - 1] == _T('"')) )
			strTemp = strTemp.Mid(1, strTemp.GetLength()-2);

		saArgv.Add(strTemp);
	}

	if(saArgv.GetSize() == 0)
		return;
	
	CString sModelFileName;
	GetModuleFileName(AfxGetInstanceHandle(), sModelFileName.GetBuffer(MAX_PATH+1), MAX_PATH);
	sModelFileName.ReleaseBuffer();
	sModelFileName.Replace(_T('/'), _T('\\'));

	if((nPos = sModelFileName.ReverseFind(_T('\\'))) > 0)
		sModelFileName = sModelFileName.Mid(nPos + 1);

	if(sModelFileName.Right(4).CompareNoCase(_T(".exe")) == 0)
		sModelFileName = sModelFileName.Left(sModelFileName.GetLength() - 4);

	CString sFirst = saArgv[0];
	sFirst.Replace(_T('/'), _T('\\'));
	if((nPos = sFirst.ReverseFind(_T('\\'))) > 0)
		sFirst = sFirst.Mid(nPos + 1);

	if(sFirst.Right(4).CompareNoCase(_T(".exe")) == 0)
		sFirst = sFirst.Left(sFirst.GetLength() - 4);

	if(sFirst.CompareNoCase(sModelFileName) == 0)
		saArgv.RemoveAt(0);
}

{
// 通过命令行参数来启动程序
	CString sParam;
	sParam += _T("MyProgram.exe ggg fff");// argv[1]是 ggg , argv[2]是 fff

	STARTUPINFO startInfo;
	PROCESS_INFORMATION pinfo = { 0 };
	ZeroMemory(&startInfo, sizeof(startInfo));
	startInfo.cb = sizeof(startInfo);
	ZeroMemory(&pinfo, sizeof(pinfo));
	startInfo.dwFlags = STARTF_USESHOWWINDOW;
	startInfo.wShowWindow = SW_SHOW;

	BOOL bRet = ::CreateProcess(nullptr, sParam.GetBuffer(0), NULL, NULL, FALSE, 0, NULL, NULL, &startInfo, &pinfo);
	sParam.ReleaseBuffer();

	if (!bRet)
	{
		CHCString strFailure = _T("启动控制台程序失败:");
		strFailure += sParam;
		AfxMessageBox(strFailure);
		return false;
	}

	CloseHandle(pinfo.hProcess);
	CloseHandle(pinfo.hThread);
	}
{
// 调用exe
	CString sPath = _T("C:\\\\Model\\Data");
	//把任务目录当命令行参数传给.exe
	STARTUPINFO StartInfo; 
	PROCESS_INFORMATION pinfo = {0}; 
	memset(&StartInfo,0,sizeof(STARTUPINFO)); 
	StartInfo.cb = sizeof(STARTUPINFO);//设定结构的大小
	StartInfo.dwFlags = STARTF_USESHOWWINDOW;
	StartInfo.wShowWindow = SW_SHOW;

	LPTSTR lpStr =  (LPTSTR)(LPCTSTR)sPath;

	// 启动exe程序
	CString sModelFileName;
	GetModuleFileName(AfxGetInstanceHandle(), 	sModelFileName.GetBuffer(MAX_PATH+1), MAX_PATH);
	sModelFileName.ReleaseBuffer();
	sModelFileName.Replace(_T('/'), _T('\\'));
	int nPos = -1;
	if((nPos = sModelFileName.ReverseFind(_T('\\'))) > 0)
	{
		sModelFileName = sModelFileName.Left(nPos);
	}

	nPos = -1;
	if((nPos = sModelFileName.ReverseFind(_T('\\'))) > 0)
	{
		sModelFileName = sModelFileName.Left(nPos + 1);
	}
	CString sExePath = sModelFileName + _T("Tools\\mydata.exe");

	CreateBuildingsMapFile();

	BOOL bRet = CreateProcess(sExePath, lpStr, NULL, NULL, FALSE, NORMAL_PRIORITY_CLASS, NULL, NULL, &StartInfo, &pinfo);
	if(bRet == FALSE)
	{
		DWORD dwErr = GetLastError();
		CString sMsg;
		sMsg.Format(_T("启动服务程序 %s 失败,错误码%d(0x%X)"), (LPCTSTR)sExePath, dwErr, dwErr);
		AfxMessageBox(sMsg);

		return;
	}
	else
	{
		CloseHandle(pinfo.hProcess);
		CloseHandle(pinfo.hThread);
	}
}

上一篇: 事务

下一篇: 事务