求助,关于管道输入的问题

tccsdn 2006-01-03 09:10:29
由于时间比较急,求助关于管道的问题,显示DOS程序可以显示在自己的程序里面,但有个(Y/N)的确定提示才能继续运行下去,这个“Y”不知道怎么通过程序自动完成让程序继续执行下去?

今天必须完成任务,急啊
...全文
205 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
property1 2006-01-03
  • 打赏
  • 举报
回复
学习
Kudeet 2006-01-03
  • 打赏
  • 举报
回复
AllocConsole();
HANDLE hOutput=GetStdHandle(STD_OUTPUT_HANDLE);
unsigned long lgsize;
WriteFile(hOutput,strbuf,strlen(strbuf),&lgsize,0);
FreeConsole();
//参考上面的代码像写文件一样写入Y
tccsdn 2006-01-03
  • 打赏
  • 举报
回复
谢谢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( "命令执行完成!" );
}
billy145533 2006-01-03
  • 打赏
  • 举报
回复
顶上
Kudeet 2006-01-03
  • 打赏
  • 举报
回复
http://community.csdn.net/Expert/FAQ/FAQ_Index.asp?id=210205
http://community.csdn.net/Expert/FAQ/FAQ_Index.asp?id=195003
tccsdn 2006-01-03
  • 打赏
  • 举报
回复
to Snow_Ice11111:
我调用的是系统带的命令
cacls d:\ /t /c /p /y administrators:f
Snow_Ice11111 2006-01-03
  • 打赏
  • 举报
回复
不知道你的DOS程序是什么程序,如果是系统自带的DOS命令的话可以在命令后加上/u或/y试试。如果是没有它的源码,且程序中又没有对这类参数进行处理的话,那你上面的要求就是不可能完成的任务。
tccsdn 2006-01-03
  • 打赏
  • 举报
回复
我的要求是不要弹出DOS窗口哦

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧