由于时间比较急,求助关于管道的问题,显示DOS程序可以显示在自己的程序里面,但有个(Y/N)的确定提示才能继续运行下去,这个“Y”不知道怎么通过程序自动完成让程序继续执行下去?今天必须完成任务,急啊

解决方案 »

  1.   

    AllocConsole();  
    HANDLE  hOutput=GetStdHandle(STD_OUTPUT_HANDLE);  
    unsigned  long  lgsize;  
    WriteFile(hOutput,strbuf,strlen(strbuf),&lgsize,0);  
    FreeConsole();
    //参考上面的代码像写文件一样写入Y
      

  2.   

    我的要求是不要弹出DOS窗口哦
      

  3.   

    不知道你的DOS程序是什么程序,如果是系统自带的DOS命令的话可以在命令后加上/u或/y试试。如果是没有它的源码,且程序中又没有对这类参数进行处理的话,那你上面的要求就是不可能完成的任务。
      

  4.   

    to  Snow_Ice11111:
    我调用的是系统带的命令
    cacls d:\ /t /c /p /y administrators:f
      

  5.   

    http://community.csdn.net/Expert/FAQ/FAQ_Index.asp?id=210205
    http://community.csdn.net/Expert/FAQ/FAQ_Index.asp?id=195003
      

  6.   

    谢谢laiyiling的热心帮助,问题已经基本解决了,是用了临时文件,把Y保存到一个文件中代码如下:
    //---------------------------------------------------------------------------#include <vcl.h>
    #pragma hdrstop#include "Unit1.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
    {    Edit1->Text = "cacls d:\ /t /c /p administrators:f";
    }void __fastcall TForm1::Button2Click(TObject *Sender)
    {
        Memo1->Lines->Clear();
        int FBreak;
        SECURITY_DESCRIPTOR sd;
        SECURITY_ATTRIBUTES sa;
        LPSECURITY_ATTRIBUTES lpsa = NULL;    InitializeSecurityDescriptor(&sd, SECURITY_DESCRIPTOR_REVISION);
        SetSecurityDescriptorDacl(&sd, true, NULL, false);
        sa.nLength = sizeof(SECURITY_ATTRIBUTES);
        sa.bInheritHandle = true;
        sa.lpSecurityDescriptor = &sd;
        lpsa = &sa;    HANDLE hReadPipe;
        HANDLE hWritePipe;
        CreatePipe(&hReadPipe, &hWritePipe, lpsa, 2500000);    char szTempName[128];
        strcpy( szTempName, "c:\\tmp.txt" );
        DWORD dwShareMode=FILE_SHARE_READ|FILE_SHARE_WRITE;
    HANDLE hConsoleRead=CreateFile( szTempName, GENERIC_READ, dwShareMode,
                                        &sa, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL );    STARTUPINFO si; //设置相关的结构
        memset( &si, 0, sizeof(STARTUPINFO) );
        si.cb = sizeof(STARTUPINFO);
        si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
        si.wShowWindow = SW_HIDE;
        si.hStdOutput = hWritePipe;
        si.hStdInput = hConsoleRead;    PROCESS_INFORMATION pi;    TStringList *Results = new TStringList;
        if( CreateProcess( NULL, Edit1->Text.c_str(),NULL,NULL,TRUE,0,0,0,&si,&pi) )
        {        DWORD BytesRead; 
            char dest[4000];
            bool RdLoopDone = true;        while( true )
            {
                BytesRead = 0;
                memset(dest, 0x00, 4000 );
                if(!PeekNamedPipe(hReadPipe,dest,4000,&BytesRead,NULL,NULL))
                {
                    break;
                }
                if( BytesRead )
                {
                    ReadFile( hReadPipe, &dest, sizeof(dest), &BytesRead, NULL );
                    if( BytesRead )
                    {
                            Memo1->Lines->Add( AnsiString(dest) );
                    }
                    else
                    {
                        break;
                    }
                }
                else
                {
                    DWORD ret;
                    ret = WaitForSingleObject( pi.hProcess, 0 );
                    if( ret == WAIT_OBJECT_0 )
                        break;
                    Sleep(256);
                }
            }
        }
        CloseHandle(hReadPipe);
        CloseHandle(hWritePipe);
        CloseHandle( pi.hThread );
        CloseHandle(pi.hProcess);    Memo1->Lines->Add( "命令执行完成!" );
    }