|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
||||
|
||||
Как проверить занят ли файл в MS Word другим пользователем?
Собственно в этом и непонятка. При открытии такого файла ворд радостно сообщает, что он занят и предлагает нам выбрать дальнейшие действия.
Вот только мне не надо этого счастья вообще. Мне требуется тупо пропустить такой файл и обработать сие как исключение. Вопрос - как? Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#2
|
||||
|
||||
можно попробовать открыть файл самостоятельно (например, через CreateFile), открылось - не занят, не открылось - занят, правда такой метод не очень гарантирует, что после проверки и до программного открытия файла в ворде пользователь его не откроет сам (а вдруг успеет )
Понять, что хочет заказчик - бесценно, ведь он платит MasterCard |
#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; Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |