Текущий архив: 2003.03.17;
Скачать: CL | DM;
Вниз
Проблема с CreateProcess в под Win9x Найти похожие ветки
← →
Slap (2003-01-17 11:48) [0]Уважаемые мастара помогите Юзеру !
-------------------------------------------------------------
Как при вызове dos-программы с помощью CreateProcess закрыть окно ДОС-сесии как это делается в WinNT. Проблема вот в чем:
я запускаю обичный bat-файлик и PROCESS_INFORMATION указываю
параметр si.wShowWindow:=SW_HIDE {STARTUPINFO} в NТ это работает , но в 95/98 окно само не закрывается, и не показывается.
procedure TForm1.Button1Click(Sender: TObject);
var si:STARTUPINFO;
pi:PROCESS_INFORMATION;
cmdline:string;
begin
ZeroMemory(@si,sizeof(si));
si.cb:=SizeOf(si);
si.dwflags:=STARTF_USESHOWWINDOW;
si.wShowWindow:=SW_HIDE;
path:=edDir.Text;
if Path[length(Path)]<>"\" then Path:=Path+"\";
cmdline:=PChar(ExtractFilePath(Application.ExeName) +"cons.bat "+str+" "+Path+" "+{edDir.Text+"\ "+}SaveDlg.FileName+" "+ext);
if not CreateProcess( nil, // No module name (use command line).
PChar(cmdline), // Command line.
nil, // Process handle not inheritable.
nil, // Thread handle not inheritable.
False, // Set handle inheritance to FALSE.
0, // No creation flags.
nil, // Use parent"s environment block.
nil, // Use parent"s starting directory.
si, // Pointer to STARTUPINFO structure.
pi )
then
begin
ShowMessage( "CreateProcess failed." );
Exit;
end;
WaitForSingleObject( pi.hProcess, INFINITE );
CloseHandle( pi.hProcess );
CloseHandle( pi.hThread );
End;
Потому мое приложение зависает на WaitForSingleObject потому что нет возможности закрыть это окно (Юзер его не видит). Не подскажите как лучше решить эту проблему, так чтобы не пугать юзера ДОС-окном.
И второе - как напечатать текст из Мемо на принтере как это делается в RichEdit. Я сейчас просто создаю RichEdit и печатаю из него.
Заранее благодарен Slap
← →
filinol (2003-01-17 20:06) [1]Надеюсь это поможет, у меня это работает
// вызов ExecAndWait("send.bat параметр")
function ExecAndWait(const aOptions:string): Boolean;
var
CurDir: String;
DccDir: String;
s: String;
buf : String;
buffer:array[0..254] of char;
StartupInfo: TStartupInfo;
ProcessInfo: TProcessInformation;
SecurAtt: TSecurityAttributes;
hStdOut, hOutRead, hOutWrite: THandle;
ResultCode : Cardinal;
i,k : Integer;
SizeStream : Integer;
OutStream:THandleStream;
begin
result := True;
DccDir := ExtractFileDir(aOptions);
CurDir := GetCurrentDir;
try
try
with SecurAtt do begin
nLength := SizeOf(SecurAtt);
lpSecurityDescriptor := nil;
bInheritHandle := BOOL(True);
end;
if not CreatePipe(hOutRead,hOutWrite,@SecurAtt,0) then Exit;
ZeroMemory(@StartupInfo, SizeOf(StartupInfo));
with StartupInfo do begin
cb := SizeOf(StartupInfo);
dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;
wShowWindow := SW_HIDE;
hStdInput:=hOutRead;
hStdOutput:=hOutWrite;
hStdError:=GetStdHandle(STD_ERROR_HANDLE);
end;
if not CreateProcess(nil, PChar(aOptions), @SecurAtt, @SecurAtt,
BOOL(True), 0, nil, PChar(DccDir), StartupInfo, ProcessInfo) then
raise Exception.Create("Ошибка запуска send.bat");
CloseHandle(ProcessInfo.hThread);
CloseHandle(hOutWrite);
WaitForSingleObject(ProcessInfo.hProcess, INFINITE);
OutStream := THandleStream.Create(hOutRead);
Buf := "";
SizeStream:=OutStream.Read(buffer,SizeOf(buffer));
while SizeStream <= SizeOf(buffer) do begin
buf:=buf + buffer;
ZeroMemory(@buffer,SizeOf(buffer));
if SizeStream < SizeOf(buffer) then break;
SizeStream:=OutStream.Read(buffer,SizeOf(buffer));
end;
if StrLen(buffer)>0 then
OemToChar(PChar(buf),PChar(buf));
{ Тут можно вывоводить
например если в в bat файле написать
echo лялялля
то выведет в основном окне приложения
или arj ? выведет справку
while pos(#13#10,buf)>0 do begin
FrmMain.Monitor.Lines.Add(copy(buf,1,pos(#13#10,buf)-1));
Delete(buf,1,pos(#13#10,buf)+1);
end;
}
ResultCode := 0;
GetExitCodeProcess(ProcessInfo.hProcess, ResultCode);
result := ResultCode = 0;
finally
CloseHandle(ProcessInfo.hProcess);
CloseHandle(hOutRead);
OutStream.Free;
end;
finally
SetCurrentDir(CurDir);
end;
end;
end.
← →
sevylor (2003-01-22 06:40) [2]Создай ему .pif файл:
procedure CreateLink(const PathObj, PathLink, Desc, Param: string);
var
IObject: IUnknown;
SLink: IShellLink;
PFile: IPersistFile;
begin
IObject := CreateComObject(CLSID_ShellLink);
SLink := IObject as IShellLink;
PFile := IObject as IPersistFile;
with SLink do begin
SetArguments(PChar(Param));
SetDescription(PChar(Desc));
SetPath(PChar(PathObj));
end;
slink.SetShowCmd(SW_SHOWNOACTIVATE);
PFile.Save(PWChar(WideString(PathLink)), FALSE);
end;
Байт по смещению $63 - псица "Закрывать окно по завершению сеанса работы":
00 - off, $10 - on
f:=TFileStream.Create(spif,fmOpenReadWrite);
f.Seek($63,soBeginning);
b:=$10;
f.Write(b,1);
f.Free;
Страницы: 1 вся ветка
Текущий архив: 2003.03.17;
Скачать: CL | DM;
Память: 0.46 MB
Время: 0.008 c