mfc 执行命令

BOOL EI_bExcuteCMD(char *pcCmd)
{
CFile fp;
SECURITY_ATTRIBUTES sa;
HANDLE hRead,hWrite;
    CString strData;

// 建立匿名管道
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
sa.lpSecurityDescriptor = NULL;
sa.bInheritHandle = TRUE;
if (!CreatePipe(&hRead, &hWrite, &sa, 1024))
    {
OutputDebugString("Error On CreatePipe()\n");
return FALSE;


// 建立进程,并继承管道输出
STARTUPINFO si;
PROCESS_INFORMATION pi; 
ZeroMemory( &si, sizeof(si) );
ZeroMemory( &pi, sizeof(pi) );
si.cb = sizeof(STARTUPINFO);
GetStartupInfo(&si); 
// si.hStdInput  = GetStdHandle( STD_INPUT_HANDLE );
//  si.hStdError  = GetStdHandle( STD_ERROR_HANDLE );
si.hStdError   = hWrite;
si.hStdOutput  = hWrite;
si.wShowWindow = SW_SHOW;
si.dwFlags     = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;


    if (!CreateProcess(NULL, pcCmd,NULL,NULL,TRUE, CREATE_NO_WINDOW,NULL,NULL,&si,&pi))//CREATE_NEW_CONSOLE | 
    {
OutputDebugString("Error on CreateProcess()\n");
return FALSE;
}

//超时时间5秒
CString sTemp;
DWORD lpExitCode;
sTemp.Format("%s", pcCmd);

if (WaitForSingleObject(pi.hProcess, 5000) == WAIT_TIMEOUT)
{
//进程还在的话强制退出
GetExitCodeProcess (pi.hProcess, &lpExitCode);
if (lpExitCode == STILL_ACTIVE)
{
lpExitCode= TerminateProcess(pi.hProcess, 0);
}
return FALSE;
}

//进程还在的话强制退出
GetExitCodeProcess (pi.hProcess, &lpExitCode);
if (lpExitCode == STILL_ACTIVE)
{
lpExitCode= TerminateProcess(pi.hProcess, 0);
}

return TRUE;
}

### MFC 中传递和调试命令线参数 在 Microsoft Foundation Classes (MFC) 应用程序中,可以通过 `CWinApp` 类的成员变量 `m_lpCmdLine` 来访问应用程序启动时传入的命令行参数。以下是关于如何在 MFC 中传递和调试命令行参数的具体说明。 #### 访问命令行参数 MFC 提供了一个全局对象 `AfxGetApp()`,它返回当前应用的对象指针。通过这个指针可以获取到 `m_lpCmdLine` 成员变量的内容。此字符串包含了所有的命令行参数[^3]。 ```cpp CString GetCommandLineParams() { CWinApp* pApp = AfxGetApp(); CString strCommandLine = pApp->m_lpCmdLine; return strCommandLine; } ``` 上述代码片段展示了如何提取命令行参数并将其存储在一个 `CString` 对象中以便进一步解析。 #### 解析命令行参数 为了更方便地处理多个参数的情况,通常会将整个命令行拆分为单独的参数列表。可以利用标准库函数 `_tcsplitpath_s` 或者手动分割字符串: ```cpp void ParseCommandLine(CString& strCommandLine) { CStringArray args; // 使用 CStringArray 存储各个参数 int nStart = 0; while (nStart < strCommandLine.GetLength()) { int nIndex = strCommandLine.Find(_T(' '), nStart); if (nIndex == -1) nIndex = strCommandLine.GetLength(); CString arg = strCommandLine.Mid(nStart, nIndex - nStart).Trim(); if (!arg.IsEmpty()) args.Add(arg); nStart = nIndex + 1; } for (int i = 0; i < args.GetSize(); ++i) { TRACE(_T("Argument %d: %s\n"), i, (LPCTSTR)args[i]); } } ``` 这段代码实现了基本的命令行参数解析逻辑,并打印每一个独立的参数用于调试目的。 #### 设置断点进行调试 当需要调试涉及命令行参数的功能时,在 Visual Studio 的项目属性对话框里设置相应的命令行选项即可。具体操作如下: - 右键点击解决方案资源管理器中的项目名称 -> 属性。 - 导航至 **配置属性** > **调试** 页面。 - 在 “命令行参数” 文本框输入测试所需的参数串。 这样运行调试模式下就会自动加载指定的参数集。 #### 示例综合演示 下面提供一段完整的示例代码展示以上概念的实际运用场景——读取外部文件路径作为参数打开文档窗口: ```cpp // MyApp.h 文件部分声明 class CMyApp : public CWinApp { public: virtual BOOL InitInstance() override; }; // MyApp.cpp 实现细节 BOOL CMyApp::InitInstance() { m_pMainWnd = new CMainFrame(); // 假设存在主框架窗体类定义 CString strParam = GetCommandLineParams(); if (!strParam.IsEmpty()) { ParseCommandLine(strParam); // 调用前面提到的方法分析数据 // 这里可以根据第一个有效参数尝试加载对应的文档实例... } m_pMainWnd->ShowWindow(SW_SHOW); UpdateWindow(); return TRUE; } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值