Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Система";
Текущий архив: 2003.03.17;
Скачать: [xml.tar.bz2];

Вниз

Проблема с 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.009 c
14-54302
KPY
2003-03-01 07:22
2003.03.17
как mpeg4 порезать на видео CD


14-54278
Pat
2003-02-27 17:57
2003.03.17
Схема для курсовика


14-54319
WWP
2003-03-01 23:46
2003.03.17
Клиент-серверные базы данных (MSSQL Server)


1-53979
MetalFan
2003-03-06 10:17
2003.03.17
С чего начать?


3-53892
VikOss
2003-02-25 14:03
2003.03.17
EhLibrus





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский