我现在做了一段程序,最后一步是要实现用户见面,之前从来没用过MFC之类的东西,我就希望像在win32 application的hello world里生成的那么个界面,然后在那里面敲命令行用来执行程序,也就是说把dos那界面换成windows的就OK 
这个应该怎么弄?

解决方案 »

  1.   

    我做了一个简单的DBMS 实现了一些最基本的功能 现在想加个界面在这里面
      

  2.   

    这需要对控制台进行输入输出重定向.
    然后,把输入字符作为命令行参数,创建CMD.EXE进程。
    用输出重定向读取CMD.EXE执行程序的结果.
    以下的代码重载了CEdit类,并响应WM_KEYDOWN消息,粗略里完成命令输入并执行功能 ,楼主可以自行增加其它代码部分。
    void CMyEdit::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) 
    {
    if (nChar != VK_RETURN)
    return; int nLineCount = GetLineCount();

    ZeroMemory(m_szCmdLine,255);
    GetLine(nLineCount-1,m_szCmdLine,255); BOOL bRet = false;
    STARTUPINFO   si   =   {0};     
    PROCESS_INFORMATION   pi   =   {0};   SECURITY_ATTRIBUTES sa;
    sa.nLength = sizeof(SECURITY_ATTRIBUTES);
    sa.bInheritHandle = TRUE;
    sa.lpSecurityDescriptor = NULL;
    HANDLE hRead,hWrite;

    if (!CreatePipe(&hRead,&hWrite,&sa,0))
    return;
    si.cb = sizeof(STARTUPINFO); 
    GetStartupInfo(&si);   
    si.hStdError = hWrite;  
    si.hStdOutput = hWrite;  
    si.wShowWindow = SW_HIDE;    
    si.dwFlags = STARTF_USESTDHANDLES|STARTF_USESHOWWINDOW  ;

        char szContent[256] = {0};
    DWORD dwNumRead = 0;
    CString strConsole = _T("");

    TCHAR szShellCmd[_MAX_PATH];
    if (!GetEnvironmentVariable(_T("ComSpec"),szShellCmd,_MAX_PATH))
    return; _tcscat(szShellCmd,_T(" /A /c "));
    _tcscat(szShellCmd,(LPCTSTR)m_szCmdLine);

    if (!SetStdHandle(STD_OUTPUT_HANDLE,si.hStdOutput))
    return;

    bRet   =   CreateProcess   (NULL, 
    szShellCmd, 
    NULL,   
    NULL,   
    TRUE,   
    NULL,   
    NULL,   
    NULL,   
    &si,   
    &pi ); 



        CloseHandle(hWrite);
    if   (bRet)     
    {
    while (true)//WaitForSingleObject(pi.hProcess, 0)==WAIT_TIMEOUT)*/ //等待控制台进程关闭
    {
    ZeroMemory(szContent,256);
    if (ReadFile(hRead,(void *)szContent,255,&dwNumRead,NULL) == NULL)
    break;
    strConsole+=szContent;
    SetWindowText(strConsole);
    Delay(50);
    }
    CloseHandle   (pi.hProcess);     
    CloseHandle   (pi.hThread);     
    }
    CEdit::OnKeyDown(nChar, nRepCnt, nFlags);
    }