Содержание материала

Hужно использовать пайпы (CreatePipe), и работать с ними как с обычным файлом.

 

Code:

const

H_IN_READ = 1;

H_IN_WRITE = 2;

H_OUT_READ = 3;

H_OUT_WRITE = 4;

H_ERR_READ = 5;

H_ERR_WRITE = 6;

 

type

TPipeHandles = array [1..6] of THandle;

var

hPipes: TPipeHandles;

ProcessInfo: TProcessInformation;

 

(************CREATE HIDDEN CONSOLE PROCESS************)

function CreateHiddenConsoleProcess(szChildName: string;

        ProcPriority: DWORD; ThreadPriority: integer): Boolean;

label

error;

var

fCreated: Boolean;

si: TStartupInfo;

sa: TSecurityAttributes;

begin

// Initialize handles

hPipes[ H_IN_READ ] := INVALID_HANDLE_VALUE;

hPipes[ H_IN_WRITE ] := INVALID_HANDLE_VALUE;

hPipes[ H_OUT_READ ] := INVALID_HANDLE_VALUE;

hPipes[ H_OUT_WRITE ] := INVALID_HANDLE_VALUE;

hPipes[ H_ERR_READ ] := INVALID_HANDLE_VALUE;

hPipes[ H_ERR_WRITE ] := INVALID_HANDLE_VALUE;

ProcessInfo.hProcess := INVALID_HANDLE_VALUE;

ProcessInfo.hThread := INVALID_HANDLE_VALUE;

// Create pipes

// initialize security attributes for handle inheritance (for WinNT)

sa.nLength := sizeof(sa);

sa.bInheritHandle := TRUE;

sa.lpSecurityDescriptor := nil;

// create STDIN pipe

if not CreatePipe( hPipes[ H_IN_READ ], hPipes[ H_IN_WRITE ], @sa, 0 ) then

   goto error;

// create STDOUT pipe

if not CreatePipe( hPipes[ H_OUT_READ ], hPipes[ H_OUT_WRITE ], @sa, 0 ) then

   goto error;

// create STDERR pipe

if not CreatePipe( hPipes[ H_ERR_READ ], hPipes[ H_ERR_WRITE ], @sa, 0 ) then

   goto error;

// process startup information

ZeroMemory(Pointer(@si), sizeof(si));

si.cb := sizeof(si);

si.dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;

si.wShowWindow := SW_HIDE;

// assign "other" sides of pipes

si.hStdInput := hPipes[ H_IN_READ ];

si.hStdOutput := hPipes[ H_OUT_WRITE ];

si.hStdError := hPipes[ H_ERR_WRITE ];

// Create a child process

try

   fCreated := CreateProcess( nil, PChar(szChildName), nil, nil, True,

   ProcPriority, // CREATE_SUSPENDED,

   nil, nil, si, ProcessInfo );

except

   fCreated := False;

end;

 

if not fCreated then

   goto error;

 

Result := True;

CloseHandle(hPipes[ H_OUT_WRITE ]);

CloseHandle(hPipes[ H_ERR_WRITE ]);

// ResumeThread( pi.hThread );

SetThreadPriority(ProcessInfo.hThread, ThreadPriority);

CloseHandle( ProcessInfo.hThread );

Exit;

//-----------------------------------------------------

error:

   ClosePipes( hPipes );

   CloseHandle( ProcessInfo.hProcess );

   CloseHandle( ProcessInfo.hThread );

   ProcessInfo.hProcess := INVALID_HANDLE_VALUE;

   ProcessInfo.hThread := INVALID_HANDLE_VALUE;

   Result := False;

end;

 

Добавить комментарий

Не использовать не нормативную лексику.

Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.

ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!


Защитный код
Обновить