Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Программа и интерфейс
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 01.02.2015, 17:17
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию Как проверить занят ли файл в MS Word другим пользователем?

Собственно в этом и непонятка. При открытии такого файла ворд радостно сообщает, что он занят и предлагает нам выбрать дальнейшие действия.
Вот только мне не надо этого счастья вообще. Мне требуется тупо пропустить такой файл и обработать сие как исключение. Вопрос - как?
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #2  
Старый 01.02.2015, 18:22
Аватар для cotseec
cotseec cotseec вне форума
Активный
 
Регистрация: 16.07.2008
Сообщения: 353
Версия Delphi: D7,TDE06,RAD09
Репутация: 1443
По умолчанию

можно попробовать открыть файл самостоятельно (например, через CreateFile), открылось - не занят, не открылось - занят, правда такой метод не очень гарантирует, что после проверки и до программного открытия файла в ворде пользователь его не откроет сам (а вдруг успеет )
__________________
Понять, что хочет заказчик - бесценно, ведь он платит MasterCard
Ответить с цитированием
  #3  
Старый 01.02.2015, 18:51
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

когда документ открыт рядом появляется файл имя которого начинается с ~$ в нем имя пользователя.
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #4  
Старый 01.02.2015, 23:04
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Цитата:
Сообщение от NumLock
когда документ открыт рядом появляется файл имя которого начинается с ~$ в нем имя пользователя.
Если бы это 100% работало, я бы и не поднял тему. Но ворд имеет гадкую особенность эпизодически оставлять эти хвостики за собой, особенно при совместном использовании документа. Как временную заплатку, так можно делать, я так и сделал, все-же хоть какая-то проверка. А вот как бы это с помощью самого ворда замутит, но боюсь такого открытого метода нет.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #5  
Старый 03.02.2015, 18:24
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Код:
uses
  ActiveX, ComObj,
...
function IsRunning(const PathName: string): Boolean;
var
  bc: IBindCtx;
  mk: IMoniker;
begin
  OleCheck(CreateBindCtx(0, bc));
  OleCheck(CreateFileMoniker(PChar(PathName), mk));
  Result:=mk.IsRunning(bc, nil, nil)=S_OK;
end;
компилировал на Delphi 2010, проверял на сетевых и локальных файлах с MS Word 2010. работает корректно.
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #6  
Старый 03.02.2015, 19:18
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Читал я про эту штуку IMoniker. Даже пример его использования скачивал, но он там в итоге запускал тот-же ворд, я и бросил не разбираясь в причинах Попробуем. Как я понял из описания этого интерфеса, приложение которое мы опрашиваем должно уметь использовать эти интерфесы, ворд как раз умеет, но для чего-то иного может и не сработать.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #7  
Старый 03.02.2015, 23:48
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Проверил, у меня ваш вариант стабильно 1 возвращает, независимо от занятости файла, хотя должен 0.
А вот такой вот вариант, работает, но с небольшой паузой, что мне не нравится.
Код:
var
  Handle: THandle;
  ErrCode: DWORD;
begin
  Handle := CreateFile(PChar('\\server\c$\Documents and Settings\Administrator\My Documents\Tel.docx'),
    GENERIC_READ or GENERIC_WRITE, 0, nil, OPEN_EXISTING, 0, 0);
  if Handle = INVALID_HANDLE_VALUE
  then begin
       ErrCode := GetLastError;
       if ErrCode = ERROR_SHARING_VIOLATION
       then ShowMessage('The process cannot access the file because it is being used by another process.')
       else ShowMessage(SysErrorMessage(ErrCode));
       end
  else CloseHandle(Handle);
end;
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 10:11.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter