Форум: "WinAPI";
Текущий архив: 2004.01.09;
Скачать: [xml.tar.bz2];
ВнизСтатус завершения работы с документом Найти похожие ветки
← →
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 вся ветка
Форум: "WinAPI";
Текущий архив: 2004.01.09;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.013 c