Вниз
Скачать: 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.027 c
7-25615
MakNik
2003-10-29 16:33
2004.01.09
как узнать путь к папке откуда запущена программа???


14-25554
Тимохов
2003-12-18 17:31
2004.01.09
Chess


1-25324
AndrewK
2003-12-22 14:50
2004.01.09
Как в TVirtualStringTree создать структуру?


14-25526
AlexHermit
2003-12-19 14:55
2004.01.09
Правильный способ организации коллекции данных


14-25529
JibSkeart
2003-12-19 12:01
2004.01.09
найти наибольших 2 элемента в 6 переменных не прибегая к массиву




   Наверх