![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
||||
|
||||
|
Собственно в этом и непонятка. При открытии такого файла ворд радостно сообщает, что он занят и предлагает нам выбрать дальнейшие действия.
Вот только мне не надо этого счастья вообще. Мне требуется тупо пропустить такой файл и обработать сие как исключение. Вопрос - как? |
|
#2
|
||||
|
||||
|
можно попробовать открыть файл самостоятельно (например, через CreateFile), открылось - не занят, не открылось - занят, правда такой метод не очень гарантирует, что после проверки и до программного открытия файла в ворде пользователь его не откроет сам (а вдруг успеет
) |
|
#3
|
||||
|
||||
|
когда документ открыт рядом появляется файл имя которого начинается с ~$ в нем имя пользователя.
|
|
#4
|
||||
|
||||
|
Цитата:
|
|
#5
|
||||
|
||||
|
Код:
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; |
|
#6
|
||||
|
||||
|
Читал я про эту штуку IMoniker. Даже пример его использования скачивал, но он там в итоге запускал тот-же ворд, я и бросил не разбираясь в причинах
Попробуем. Как я понял из описания этого интерфеса, приложение которое мы опрашиваем должно уметь использовать эти интерфесы, ворд как раз умеет, но для чего-то иного может и не сработать. |
|
#7
|
||||
|
||||
|
Проверил, у меня ваш вариант стабильно 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; |