/*
* 通过管道技术,将dir /?的帮助信息输入到MFC应用程序的一个CEdit控件中。
* VC++6.0 + WinXP 通过
*
* detrox, 2003
*/void CPipeDlg::OnButton1()
{
SECURITY_ATTRIBUTES sa;
HANDLE hRead,hWrite;
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
sa.lpSecurityDescriptor = NULL;
sa.bInheritHandle = TRUE;
if (!CreatePipe(&hRead,&hWrite,&sa,0)) {
MessageBox("Error On CreatePipe()");
return;
}
STARTUPINFO si;
PROCESS_INFORMATION pi;
si.cb = sizeof(STARTUPINFO);
GetStartupInfo(&si);
si.hStdError = hWrite;
si.hStdOutput = hWrite;
si.wShowWindow = SW_HIDE;
si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
if (!CreateProcess(NULL,"c:\\windows\\system32\\cmd.exe/c dir /?"
,NULL,NULL,TRUE,NULL,NULL,NULL,&si,&pi)) {
MessageBox("Error on CreateProcess()");
return;
}
CloseHandle(hWrite);
char buffer[4096] = {0};
DWORD bytesRead;
while (true) {
if (ReadFile(hRead,buffer,4095,&bytesRead,NULL) == NULL)
break;
m_Edit1 += buffer;
UpdateData(false);
Sleep(200);
}
}
* 通过管道技术,将dir /?的帮助信息输入到MFC应用程序的一个CEdit控件中。
* VC++6.0 + WinXP 通过
*
* detrox, 2003
*/void CPipeDlg::OnButton1()
{
SECURITY_ATTRIBUTES sa;
HANDLE hRead,hWrite;
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
sa.lpSecurityDescriptor = NULL;
sa.bInheritHandle = TRUE;
if (!CreatePipe(&hRead,&hWrite,&sa,0)) {
MessageBox("Error On CreatePipe()");
return;
}
STARTUPINFO si;
PROCESS_INFORMATION pi;
si.cb = sizeof(STARTUPINFO);
GetStartupInfo(&si);
si.hStdError = hWrite;
si.hStdOutput = hWrite;
si.wShowWindow = SW_HIDE;
si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
if (!CreateProcess(NULL,"c:\\windows\\system32\\cmd.exe/c dir /?"
,NULL,NULL,TRUE,NULL,NULL,NULL,&si,&pi)) {
MessageBox("Error on CreateProcess()");
return;
}
CloseHandle(hWrite);
char buffer[4096] = {0};
DWORD bytesRead;
while (true) {
if (ReadFile(hRead,buffer,4095,&bytesRead,NULL) == NULL)
break;
m_Edit1 += buffer;
UpdateData(false);
Sleep(200);
}
}
sa:SECURITY_ATTRIBUTES;
hRead,hWrite:THandle;
si:STARTUPINFO;
pi:PROCESS_INFORMATION;
bytesRead:DWORD;
buffer:PChar;begin
sa.nLength := sizeof(SECURITY_ATTRIBUTES);
sa.lpSecurityDescriptor := Nil;
sa.bInheritHandle := TRUE;
if (not CreatePipe(hRead,hWrite,@sa,0) ) then
begin
ShowMessage('Error On CreatePipe()');
exit;
end; si.cb := sizeof(STARTUPINFO);
GetStartupInfo(si);
si.hStdError := hWrite;
si.hStdOutput := hWrite;
si.wShowWindow := SW_HIDE;
si.dwFlags := STARTF_USESHOWWINDOW;
if ( not CreateProcess(nil,PChar('c:\\windows\\system32\\cmd.exe/c dir /?')
,nil,nil,true,0,nil,nil,si,pi)) then
begin
ShowMessage('Error on CreateProcess()');
exit;
end;
CloseHandle(hWrite); while (true) do
begin
if (ReadFile(hRead,buffer,4095,bytesRead,nil) = false) then
break;
m_Edit1.Text = m_Edit1.Text+buffer;
Sleep(200);
end;end;
看了帮助后才那么改的
buffer:PChar;
改为
buffer: array[1..4096] of char;si.dwFlags := STARTF_USESHOWWINDOW OR STARTF_USESTDHANDLES ;
var
buffer :array [0..4095] of char;
因为Delphi中CreatePipe的原型是这样的CreatePipe(var hReadPipe, hWritePipe :THandle;
后面照旧,就懒得写了)。
这里的var代表是传址调用,如果你传入@hRead和@hWrite进去,那么你传入的就是hRead和hWrite的地址进去那么CreatePipe就无法修改地址的地址了