![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Блокировка запущенной программы из программы [D7, WinXP]
Сергей из Самары © (2011-06-02 12:26:00)Есть такая задача:
В БД хранится некий вордовский документ. Его нужно извлечь из базы, открыть. Если в нем внесена правка, сохранить и снова загрузить в базу. Понятно, что пока файл открыт ни другой пользователь не может получить доступ к этому файлу в базе, ни сам пользователь не должен работать в в программе. То есть программа должна висеть, пока человек либо не закроет файл без сохранения, либо сохранит его и тоже закроет.
Реализовал я механизм следующим образом:
time_start := GetFileDate(fname); //Получаем время создания файла
FillChar( Si, SizeOf( Si ) , 0 );
with Si do
begin
cb := SizeOf( Si);
dwFlags := STARTF_USESHOWWINDOW;
wShowWindow := SW_SHOW;
end;
wp:= '"'+Form1.word_p+'" '+fname; //путь к ворду и параметр (имя файла)
Form1.WindowState:=wsminimized;
if Createprocess(nil, Pchar(wp), nil, nil,false,
CREATE_DEFAULT_ERROR_MODE, nil, nil, si, p) //запускаем
then begin
CloseHandle(p.hThread);
ShowWindow(Form1.Handle, SW_HIDE);
while (WaitForSingleObject(p.hProcess, 100) = WAIT_TIMEOUT) do //пока программа открыта, доступа к основной программе нет
Application.ProcessMessages;
CloseHandle(p.hProcess);
ShowWindow(Form1.Handle, SW_SHOWNOACTIVATE);
end;
Form1.WindowState:=wsMaximized;
time_fin := GetFileDate(fname); //получаем время изменения файла
if Form5.Tag = 1 then begin //индикатор (файл можно просто открыть для просмотра, тогда его не нужно сохранять в базе, даже если в него внесли изменения
If time_start <> time_fin then //проверяется вносили ли в файл изменения, если да, то сохраняем в файл
begin
DBm.Priem.Edit;
DBm.PriemPROTOKOL_BL.Clear;
DBm.PriemPROTOKOL_BL.LoadFromFile(fname);
DBm.Priem.Post;
end;
end;
DeleteFile(fname); //удаляем сам файл с диска
Все работает, все проверяется... до тех пор, пока не запущен как какой-либо другой вордовский файл, совершенно посторонний. Если запущен ворд, то WaitForSingleObject пролетает махом. В результате программа не блокируется и выполняется дальше. Даже если в файл внесены изменения в базу он записан не будет. Подскажите, как можно решить эту проблему? Возможно ли как-то, если на компе запущены другие вордовские процессы, блокировать и их?Или проблему можно решить иначе?
QAZ (2011-06-02 12:58:00) [21]а зачем вообще эти файлы хранить в бд ? приэтом открывать с диска? и сохранять на дскже?