Вниз
Скачать: CL | DM;

Статус завершения работы с документом   Найти похожие ветки 

 
Gilk ©   (2003-11-05 15:35) [0]

Хочу получить статус завершения работы с документом после запуска командами ShellExecuteEx или CreateProcess.
1. WaitforSingleObject не отлавливается при уже открытом Word
2. При запуске с помощью ShellExecuteEx (когда Word еще не открыт до запуска) Word не закрывается


 
clickmaker ©   (2003-11-05 15:52) [1]

что значит "статус завершения работы с документом"? Статус завершения процесса? Тогда GetProcessExitCode


 
Gilk ©   (2003-11-05 15:58) [2]

Запускаю документ с помощью процедуры.
Возникают проблемы указанные в топике выше.
procedure TBlobFields.RunFileAndWait(Path:string);
var
SI:TShellExecuteInfo;
begin
ZeroMemory(@SI, SizeOf(SI));
SI.cbSize := SizeOf(TShellExecuteInfo);
with SI do
begin
fMask := SEE_MASK_NOCLOSEPROCESS;
lpFile := PChar(Path);
Wnd := Application.Handle;
nShow := SW_SHOWNORMAL;
end;
IF ShellExecuteEx(@SI) then
WaitForSingleObject(SI.hProcess, INFINITE);

end;


 
clickmaker ©   (2003-11-05 17:10) [3]

А, вордешник небось 2000? Т.е. новый процесс не стартует на новый файл.
Я енту проблему так решил:

FindExecutable(PChar(FileName), PChar(ExtractFilePath(Application.ExeName)), AppName);
ZeroMemory(@pi, SizeOf(PROCESS_INFORMATION));
ZeroMemory(@si, SizeOf(STARTUPINFO));
si.cb := SizeOf(STARTUPINFO);
si.dwFlags := STARTF_USESHOWWINDOW;
si.wShowWindow := SW_SHOWNORMAL;

if (WordVersion > 8) then begin

Result := CreateProcess(nil, PChar(Format(""%s" /n", [AppName])), nil, nil, FALSE, CREATE_DEFAULT_ERROR_MODE or NORMAL_PRIORITY_CLASS, nil, nil,
si, pi);
if Result then begin

WaitForInputIdle(pi.hProcess, INFINITE);

ddeMgr := TDdeMgr.Create(Application);
DDEClient := TDDEClientConv.Create(nil);
DDEClient.ConnectMode := ddeManual;
try
Reg := TRegistry.Create(KEY_READ);
try
Reg.RootKey := HKEY_CLASSES_ROOT;
Reg.OpenKey(Ext, false);
Key := Reg.ReadString("");
Reg.CloseKey;
Key := Key + "\shell\Open\ddeexec";
Reg.OpenKey(Key, false);
Macro := Reg.ReadString("");
Reg.CloseKey;
Reg.OpenKey(Key + "\Application", false);
Service := Reg.ReadString("");
Reg.CloseKey;
Reg.OpenKey(Key + "\Topic", false);
Topic := Reg.ReadString("");
Reg.CloseKey;
finally
Reg.Free;
end;
DDEClient.ServiceApplication := Service;
DDEClient.SetLink(Service, Topic);
Result := DDEClient.OpenLink;
if Result then begin
Result := DDEClient.ExecuteMacro(PChar(StringReplace(Macro, "%1", FileName, [])), false);
DDEClient.CloseLink;
end;
finally
DDEClient.Free;
end;
end;
end else begin

Result := CreateProcess(nil, PChar(Format(""%s" "%s"", [AppName, FileName])), nil, nil, FALSE,
CREATE_DEFAULT_ERROR_MODE or NORMAL_PRIORITY_CLASS, nil, nil,
si, pi);
end;
if Result then begin

WaitForSingleObject(pi.hProcess, INFINITE);
end;
if (pi.hProcess <> 0) then CloseHandle(pi.hProcess);
if (pi.hThread <> 0) then CloseHandle(pi.hThread);



Страницы: 1 вся ветка

Скачать: CL | DM;



Память: 0.46 MB
Время: -0.929 c
1-25423
3DiMaN
2003-12-24 10:38
2004.01.09
просмотр изображения


14-25508
Йорген фон Швах
2003-12-16 09:01
2004.01.09
Скоро скоро Новый год!


3-25238
Mikka
2003-12-11 10:27
2004.01.09
Базы данных SQL


1-25339
Mip
2003-12-22 10:02
2004.01.09
Помогите плз. разобраться с Word


8-25454
Virus
2003-09-09 11:00
2004.01.09
смена фона рабочего стола




   Наверх