求助,关于管道输入的问题 由于时间比较急,求助关于管道的问题,显示DOS程序可以显示在自己的程序里面,但有个(Y/N)的确定提示才能继续运行下去,这个“Y”不知道怎么通过程序自动完成让程序继续执行下去?今天必须完成任务,急啊 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 AllocConsole(); HANDLE hOutput=GetStdHandle(STD_OUTPUT_HANDLE); unsigned long lgsize; WriteFile(hOutput,strbuf,strlen(strbuf),&lgsize,0); FreeConsole();//参考上面的代码像写文件一样写入Y 我的要求是不要弹出DOS窗口哦 不知道你的DOS程序是什么程序,如果是系统自带的DOS命令的话可以在命令后加上/u或/y试试。如果是没有它的源码,且程序中又没有对这类参数进行处理的话,那你上面的要求就是不可能完成的任务。 to Snow_Ice11111:我调用的是系统带的命令cacls d:\ /t /c /p /y administrators:f http://community.csdn.net/Expert/FAQ/FAQ_Index.asp?id=210205http://community.csdn.net/Expert/FAQ/FAQ_Index.asp?id=195003 谢谢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( "命令执行完成!" );} 关于 Visual C++ 请教子类控件的消息传递。 急急!很大的问题 在sdk中的通讯 高手请进,呵呵,关于菜单的问题 如何将窗口内容生成图像文件? 透明打印 VC 环境设置? VC会偷偷删除文件?太诡异了。 关于VS.net设置的几个问题。 那个消息总是在窗口切换时用到? CSocket用法与线程同步问题 姹傚姪:鏈夊摢浣嶉珮鎵嬫効鎰忓府蹇欐敼涓嬬▼搴廩鎬
HANDLE hOutput=GetStdHandle(STD_OUTPUT_HANDLE);
unsigned long lgsize;
WriteFile(hOutput,strbuf,strlen(strbuf),&lgsize,0);
FreeConsole();
//参考上面的代码像写文件一样写入Y
我调用的是系统带的命令
cacls d:\ /t /c /p /y administrators:f
http://community.csdn.net/Expert/FAQ/FAQ_Index.asp?id=195003
//---------------------------------------------------------------------------#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( "命令执行完成!" );
}