Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Блокировка запущенной программы из программы [D7, WinXP]


Страницы:   1 2

Сергей из Самары ©   (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]

а зачем вообще эти файлы хранить в бд ? приэтом открывать с диска? и сохранять на дскже?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо