![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
CreateProcess в Win2k [D6, Win2k]
Onyx © (2004-02-05 09:01:00)Почему CreateProcess не хочет перенаправлять вывод в файл при запуске консольного приложения? И хочу заметить, что в Win98 все нормально, а в Win2kникак не хочет.
var
si : STARTUPINFO;
pi : PROCESS_INFORMATION;
HFile : Cardinal;
ComLine : string;
begin
ComLine:='tasm32.exe /ml 1.asm';
HFile:= FileCreate('ASMP.tmp');
ZeroMemory(@si,sizeof(si));
si.dwFlags:=STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;
si.wShowWindow:=SW_HIDE;
si.hStdInput:= GetStdHandle(STD_INPUT_HANDLE);
si.hStdOutput:= HFile; //вывод направляем в файл
si.hStdError:= GetStdHandle(STD_ERROR_HANDLE);
si.cb:=SizeOf(si);
if CreateProcess(nil, PChar(ComLine), nil, nil, false, 0,
nil,nil, si, pi) then
begin
WaitForSingleObject( pi.hProcess, INFINITE );
CloseHandle( pi.hProcess );
CloseHandle( pi.hThread );
FileClose( HFile );
end;
end;
Вот ёще вариант:
begin
ComLine:='tasm32.exe /ml 1.asm';
HFile:= FileCreate('ASMP.tmp');
SetStdHandle(STD_OUTPUT_HANDLE, HFile);
ZeroMemory(@si,sizeof(si));
si.dwFlags:=STARTF_USESHOWWINDOW;
si.wShowWindow:=SW_HIDE;
si.cb:=SizeOf(si);
if CreateProcess(nil, PChar(ComLine), nil, nil, true, 0,
nil,nil, si, pi) then
//запуск процесса с наследованием описателей
begin
WaitForSingleObject( pi.hProcess, INFINITE );
CloseHandle( pi.hProcess );
CloseHandle( pi.hThread );
FileClose( HFile );
end;
end;
И оба эти варианта не хотят работать под Win2k.
Onyx (2004-02-05 10:29:00) [1]Попробуем...
AKul (2004-02-05 09:50:00) [2]
> Onyx (05.02.04 09:01)
Ну это же NT.
Все исправления относятся к 1 варианту.
1. Необходимо разрешить наследование Handle'а файла, например, так (SA: SECURITY_ATTRIBUTES):
SA.nLength:=sizeof(SA);
SA.lpSecurityDescriptor:=nil;
SA.bInheritHandle:=true;
HFile:=CreateFile('SomeFile.tmp',GENERIC_READ or GENERIC_WRITE,0,
@SA,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0);
2. Разрешить дочернему процессу наследовать Handle'ы родительского:
if CreateProcess(nil, PChar(ComLine), nil, nil, true, 0,
nil,nil, si, pi) then