003
06.07.2003, 12:27 Uhr
Uwe
C/C++ Master (Administrator)
|
Hallo, ups, dann über Pipes, folgend z.B. das einlesen der Ausgabe von Cmd.exe mit Parameterübergabe zum auflisten des aktuellen Ordner. Schreiben funktioniert ähnlich.
C++: |
void __fastcall TForm1::Button1Click(TObject *Sender) { SECURITY_ATTRIBUTES sa; ZeroMemory(&sa,sizeof(SECURITY_ATTRIBUTES)); sa.nLength=sizeof(SECURITY_ATTRIBUTES); sa.bInheritHandle=true; sa.lpSecurityDescriptor=NULL; HANDLE hRead; HANDLE hWrite; if(!CreatePipe(&hRead,&hWrite,&sa,0)) RaiseLastWin32Error();
STARTUPINFO si; ZeroMemory(&si,sizeof(STARTUPINFO)); si.cb=sizeof(STARTUPINFO); si.dwFlags=STARTF_USESHOWWINDOW|STARTF_USESTDHANDLES; si.wShowWindow=SW_HIDE; si.hStdOutput=hWrite; si.hStdError=hWrite;
PROCESS_INFORMATION pi; ZeroMemory(&pi,sizeof(PROCESS_INFORMATION)); if(!CreateProcess("C:\\Windows\\System32\\Cmd.exe", "/C Dir",NULL,NULL,true,0,NULL,NULL,&si,&pi)) RaiseLastWin32Error(); char Data[1024]; for (;;){ DWORD BRead; DWORD BTotal; DWORD BLeft;
if(!PeekNamedPipe(hRead,Data,sizeof(Data),&BRead, &BTotal,&BLeft))RaiseLastWin32Error(); if(BRead){ if(!ReadFile(hRead,Data,sizeof(Data)-1,&BRead,NULL)) RaiseLastWin32Error(); Data[BRead]='\0'; Memo1->Lines->Add(AnsiString(Data));
} else{ if(WaitForSingleObject(pi.hProcess,0)==WAIT_OBJECT_0)break;
} } CloseHandle(pi.hThread); CloseHandle(pi.hProcess); CloseHandle(hRead); CloseHandle(hWrite);
}
|
-- "Es ist schwierig, ein Programm wirklich idiotensicher zu machen, weil Idioten so genial sind."
Bis dann... Uwe |