怎么将DOS界面改为对话框界面?
我现在有一个DOS程序,我现在想把它改为一个对话框,就是我按一下BUTTON,然后不出现DOS的那个黑屏界面,在后台自动的执行,然后将输出的结果写到一个文件里。
我现在的问题是,
1:用什么函数才能实现启动另外一个程序,这个程序的输入是要求带参数的。比如它的欢迎界面是 
   welcome>
   然后输入命令以及参数。比如我输入一个命令:
   welcome>dosome -t
   然后就会执行,执行完后会有结果显示,当然这是在DOS屏上显示的。
2:怎么将显示的结果保存在文件里。
我知道可以用CreateProcess但是不知道怎么传递参数。

解决方案 »

  1.   

    1.可以使用ShellExecute,但是Createprocess看起来更象system
    2.即使你都显示出来了,当然你知道在什么地方保存数据
     在VC中你还是可以使用 FILE * + fopen + fwrite + fprintf + fscanf + fread + fclose 的方式
    CreatePrcess的用法
    void main( VOID )
    {
        STARTUPINFO si;
        PROCESS_INFORMATION pi;    ZeroMemory( &si, sizeof(si) );
        si.cb = sizeof(si);
        ZeroMemory( &pi, sizeof(pi) );    // Start the child process. 
        if( !CreateProcess( NULL, // No module name (use command line). 
            "MyChildProcess", // Command line. (这里可以换成 dosome -t)
            NULL,             // Process handle not inheritable. 
            NULL,             // Thread handle not inheritable. 
            FALSE,            // Set handle inheritance to FALSE. 
            0,                // No creation flags. 
            NULL,             // Use parent's environment block. 
            NULL,             // Use parent's starting directory. 
            &si,              // Pointer to STARTUPINFO structure.
            &pi )             // Pointer to PROCESS_INFORMATION structure.
        ) 
        {
            ErrorExit( "CreateProcess failed." );
        }    // Wait until child process exits.
        WaitForSingleObject( pi.hProcess, INFINITE );  // 这一句等到关闭DOS窗口才返回
                              // 去掉这句就不会等待    // Close process and thread handles. 
        CloseHandle( pi.hProcess );
        CloseHandle( pi.hThread );
    }
      

  2.   

    1. 用CreateProcess启动那个DOS程序
    2.你可以建立管道,然后通过读写管道句柄,获取输出信息,然后使用CFile 创建文件对象,写入文件。参考管道编程的资料。
      

  3.   

    change main to winmain
    change application setting to windows , change the lib you will link .then build , will be ok
      

  4.   

    抱歉前面没有看清楚你的第二个问题,实际上这个问题在MSDN 2003中已经有解决方案(我不清楚在MSDN98或MSDN2000中是否有)HOWTO: Spawn Console Processes with Redirected Standard Handles
    SUMMARY
    This article describes how to redirect the input and output of a child process that receives input from the standard input handle or sends output to the standard output handle. The Win32 API enables applications to spawn a child console process with redirected standard handles. This feature allows a parent process to send and receive the input and output of the child process. NOTE: Some console based applications do not use the standard handles for their input/output (IO) operations. The Win32 API does not support redirection of these processes. 
    MORE INFORMATION
    The CreateProcess() API through the STARTUPINFO structure enables you to redirect the standard handles of a child console based process. If the dwFlags member is set to STARTF_USESTDHANDLES, then the following STARTUPINFO members specify the standard handles of the child console based process: 
       HANDLE hStdInput - Standard input handle of the child process.
       HANDLE hStdOutput - Standard output handle of the child process.
       HANDLE hStdError - Standard error handle of the child process.

    You can set these handles to either a pipe handle, file handle, or any handle that can do synchronous reads and writes through the ReadFile() and WriteFile() API. The handles must be inheritable and the CreateProcess() API must specify that inheritable handles are to be inherited by the child process by specifying TRUE in the bInheritHandles parameter. If the parent process only wishes to redirect one or two standard handles, specifying GetStdHandle() for the specific handles causes the child to create the standard handle as it normally would without redirection. For example, if the parent process only needs to redirect the standard output and error of the child process, then the hStdInput member of the STARTUPINFO structure is filled as follows:
      

  5.   

    #include<windows.h>   void DisplayError(char *pszAPI);
       void ReadAndHandleOutput(HANDLE hPipeRead);
       void PrepAndLaunchRedirectedChild(HANDLE hChildStdOut,
                                         HANDLE hChildStdIn,
                                         HANDLE hChildStdErr);
       DWORD WINAPI GetAndSendInputThread(LPVOID lpvThreadParam);   HANDLE hChildProcess = NULL;
       HANDLE hStdIn = NULL; // Handle to parents std input.
       BOOL bRunThread = TRUE;
       void main ()
       {
          HANDLE hOutputReadTmp,hOutputRead,hOutputWrite;
          HANDLE hInputWriteTmp,hInputRead,hInputWrite;
          HANDLE hErrorWrite;
          HANDLE hThread;
          DWORD ThreadId;
          SECURITY_ATTRIBUTES sa;
          // Set up the security attributes struct.
          sa.nLength= sizeof(SECURITY_ATTRIBUTES);
          sa.lpSecurityDescriptor = NULL;
          sa.bInheritHandle = TRUE;
          // Create the child output pipe.
          if (!CreatePipe(&hOutputReadTmp,&hOutputWrite,&sa,0))
             DisplayError("CreatePipe");
          // Create a duplicate of the output write handle for the std error
          // write handle. This is necessary in case the child application
          // closes one of its std output handles.
          if (!DuplicateHandle(GetCurrentProcess(),hOutputWrite,
                               GetCurrentProcess(),&hErrorWrite,0,
                               TRUE,DUPLICATE_SAME_ACCESS))
             DisplayError("DuplicateHandle");
          // Create the child input pipe.
          if (!CreatePipe(&hInputRead,&hInputWriteTmp,&sa,0))
             DisplayError("CreatePipe");
          // Create new output read handle and the input write handles. Set
          // the Properties to FALSE. Otherwise, the child inherits the
          // properties and, as a result, non-closeable handles to the pipes
          // are created.
          if (!DuplicateHandle(GetCurrentProcess(),hOutputReadTmp,
                               GetCurrentProcess(),
                               &hOutputRead, // Address of new handle.
                               0,FALSE, // Make it uninheritable.
                               DUPLICATE_SAME_ACCESS))
             DisplayError("DupliateHandle");      if (!DuplicateHandle(GetCurrentProcess(),hInputWriteTmp,
                               GetCurrentProcess(),
                               &hInputWrite, // Address of new handle.
                               0,FALSE, // Make it uninheritable.
                               DUPLICATE_SAME_ACCESS))
          DisplayError("DupliateHandle");
          // Close inheritable copies of the handles you do not want to be
          // inherited.
          if (!CloseHandle(hOutputReadTmp)) DisplayError("CloseHandle");
          if (!CloseHandle(hInputWriteTmp)) DisplayError("CloseHandle");
          // Get std input handle so you can close it and force the ReadFile to
          // fail when you want the input thread to exit.
          if ( (hStdIn = GetStdHandle(STD_INPUT_HANDLE)) ==
                                                    INVALID_HANDLE_VALUE )
             DisplayError("GetStdHandle");      PrepAndLaunchRedirectedChild(hOutputWrite,hInputRead,hErrorWrite);
          // Close pipe handles (do not continue to modify the parent).
          // You need to make sure that no handles to the write end of the
          // output pipe are maintained in this process or else the pipe will
          // not close when the child process exits and the ReadFile will hang.
          if (!CloseHandle(hOutputWrite)) DisplayError("CloseHandle");
          if (!CloseHandle(hInputRead )) DisplayError("CloseHandle");
          if (!CloseHandle(hErrorWrite)) DisplayError("CloseHandle");
          // Launch the thread that gets the input and sends it to the child.
          hThread = CreateThread(NULL,0,GetAndSendInputThread,
                                  (LPVOID)hInputWrite,0,&ThreadId);
          if (hThread == NULL) DisplayError("CreateThread");
          // Read the child's output.
          ReadAndHandleOutput(hOutputRead);
          // Redirection is complete
          // Force the read on the input to return by closing the stdin handle.
          if (!CloseHandle(hStdIn)) DisplayError("CloseHandle");
          // Tell the thread to exit and wait for thread to die.
          bRunThread = FALSE;      if (WaitForSingleObject(hThread,INFINITE) == WAIT_FAILED)
             DisplayError("WaitForSingleObject");      if (!CloseHandle(hOutputRead)) DisplayError("CloseHandle");
          if (!CloseHandle(hInputWrite)) DisplayError("CloseHandle");
       }
       /////////////////////////////////////////////////////////////////////// 
       // PrepAndLaunchRedirectedChild
       // Sets up STARTUPINFO structure, and launches redirected child.
       /////////////////////////////////////////////////////////////////////// 
       void PrepAndLaunchRedirectedChild(HANDLE hChildStdOut,
                                         HANDLE hChildStdIn,
                                         HANDLE hChildStdErr)
       {
          PROCESS_INFORMATION pi;
          STARTUPINFO si;      // Set up the start up info struct.
          ZeroMemory(&si,sizeof(STARTUPINFO));
          si.cb = sizeof(STARTUPINFO);
          si.dwFlags = STARTF_USESTDHANDLES;
          si.hStdOutput = hChildStdOut;
          si.hStdInput  = hChildStdIn;
          si.hStdError  = hChildStdErr;
          // Use this if you want to hide the child:
          //     si.wShowWindow = SW_HIDE;
          // Note that dwFlags must include STARTF_USESHOWWINDOW if you want to
          // use the wShowWindow flags.
          // Launch the process that you want to redirect (in this case,
          // Child.exe). Make sure Child.exe is in the same directory as
          // redirect.c launch redirect from a command line to prevent location
          // confusion.
          if (!CreateProcess(NULL,"Child.EXE",NULL,NULL,TRUE,
                             CREATE_NEW_CONSOLE,NULL,NULL,&si,&pi))
             DisplayError("CreateProcess");
          // Set global child process handle to cause threads to exit.
          hChildProcess = pi.hProcess;
          // Close any unnecessary handles.
          if (!CloseHandle(pi.hThread)) DisplayError("CloseHandle");
       }
       /////////////////////////////////////////////////////////////////////// 
       // ReadAndHandleOutput
       // Monitors handle for input. Exits when child exits or pipe breaks.
       /////////////////////////////////////////////////////////////////////// 
       void ReadAndHandleOutput(HANDLE hPipeRead)
       {
          CHAR lpBuffer[256];
          DWORD nBytesRead;
          DWORD nCharsWritten;      while(TRUE)
          {
             if (!ReadFile(hPipeRead,lpBuffer,sizeof(lpBuffer),
                                              &nBytesRead,NULL) || !nBytesRead)
             {
                if (GetLastError() == ERROR_BROKEN_PIPE)
                   break; // pipe done - normal exit path.
                else
                   DisplayError("ReadFile"); // Something bad happened.
             }         // Display the character read on the screen.
             if (!WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE),lpBuffer,
                               nBytesRead,&nCharsWritten,NULL))
                DisplayError("WriteConsole");
          }
       }
      

  6.   

    /////////////////////////////////////////////////////////////////////// 
       // GetAndSendInputThread
       // Thread procedure that monitors the console for input and sends input
       // to the child process through the input pipe.
       // This thread ends when the child application exits.
       /////////////////////////////////////////////////////////////////////// 
       DWORD WINAPI GetAndSendInputThread(LPVOID lpvThreadParam)
       {
          CHAR read_buff[256];
          DWORD nBytesRead,nBytesWrote;
          HANDLE hPipeWrite = (HANDLE)lpvThreadParam;      // Get input from our console and send it to child through the pipe.
          while (bRunThread)
          {
             if(!ReadConsole(hStdIn,read_buff,1,&nBytesRead,NULL))
                DisplayError("ReadConsole");         read_buff[nBytesRead] = '\0'; // Follow input with a NULL.         if (!WriteFile(hPipeWrite,read_buff,nBytesRead,&nBytesWrote,NULL))
             {
                if (GetLastError() == ERROR_NO_DATA)
                   break; // Pipe was closed (normal exit path).
                else
                DisplayError("WriteFile");
             }
          }      return 1;
       }
       /////////////////////////////////////////////////////////////////////// 
       // DisplayError
       // Displays the error number and corresponding message.
       /////////////////////////////////////////////////////////////////////// 
       void DisplayError(char *pszAPI)
       {
           LPVOID lpvMessageBuffer;
           CHAR szPrintBuffer[512];
           DWORD nCharsWritten;       FormatMessage(
                    FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM,
                    NULL, GetLastError(),
                    MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
                    (LPTSTR)&lpvMessageBuffer, 0, NULL);       wsprintf(szPrintBuffer,
             "ERROR: API    = %s.\n   error code = %d.\n   message    = %s.\n",
                    pszAPI, GetLastError(), (char *)lpvMessageBuffer);       WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE),szPrintBuffer,
                         lstrlen(szPrintBuffer),&nCharsWritten,NULL);       LocalFree(lpvMessageBuffer);
           ExitProcess(GetLastError());
       }   ////////////////////////////////////////////////////////////////////// 
       // child.c
       // Echoes all input to stdout. This will be redirected by the redirect
       // sample. Compile and build child.c as a Win32 Console application and
       // put it in the same directory as the redirect sample.
       // 
       #include<windows.h>
       #include<stdio.h>
       #include<string.h>   void main ()
       {
          FILE*    fp;
          CHAR     szInput[1024];
          // Open the console. By doing this, you can send output directly to
          // the console that will not be redirected.      fp = fopen("CON", "w");
          if (!fp) {
             printf("Error opening child console - perhaps there is none.\n");
             fflush(NULL);
          }
          else
          {      // Write a message direct to the console (will not be redirected).         fprintf(fp,"This data is being printed directly to the\n");
             fprintf(fp,"console and will not be redirected.\n\n");
             fprintf(fp,"Since the standard input and output have been\n");
             fprintf(fp,"redirected data sent to and from those handles\n");
             fprintf(fp,"will be redirected.\n\n");
             fprintf(fp,"To send data to the std input of this process.\n");
             fprintf(fp,"Click on the console window of the parent process\n");
             fprintf(fp,"(redirect), and enter data from it's console\n\n");
             fprintf(fp,"To exit this process send the string 'exit' to\n");
             fprintf(fp,"it's standard input\n");
             fflush(fp);
          }      ZeroMemory(szInput,1024);
          while (TRUE)
          {
             gets(szInput);
             printf("Child echoing [%s]\n",szInput);
             fflush(NULL);  // Must flush output buffers or else redirection
                            // will be problematic.
             if (!_stricmp(szInput,"Exit") )
                break;         ZeroMemory(szInput,strlen(szInput) );      }
       }
      

  7.   

    我还想问一个CreateProcess的问题:
    我有一个DOS程序,我要完成任务要三步,并且这三步是顺序执行的,就是说在完成的二步之前,第一步必须完成,如下:
       welcome>readin -t
       welcome>dosome -t
       welcome>writeout -t
    我该怎么使用这个CreateProcess。
    如果创建三个CreateProcess的化,那不是重新启动了三个进程,那样就不能顺序执行了。
    也就是说,第一步我CreateProcess,执行了readin -t,
    第二步我CreateProcess,执行了dosome -t,但是此时相当于重新启动了一个进程,也就相当于没有执行第一步,在这种情况下,该怎么办?
      

  8.   

    有没有详细的方法,比如我想把输出到DOS的东西输出到文件,怎么办?