Ошибка отказа в разрешении при обновлении локальной надстройки MSOffice из сети - PullRequest
3 голосов
/ 03 августа 2010

Я пытаюсь написать процедуру в PowerPoint 2003, которая позволит автоматически обновлять установленную надстройку. Общий процесс выглядит следующим образом:

  1. Удалить надстройку

    <code>For Each objAddIn In Application.AddIns
        If UCase(objAddIn.Name) = UCase(AddInName) Then
            With objAddIn
                .Registered = msoFalse
                .AutoLoad = msoFalse
                .Loaded = msoFalse
            End With
        End If
    Next
  2. Удалить файл из локального каталога надстроек

    <code>Set objFSO = CreateObject("Scripting.FileSystemObject")<br>
    If objFSO.FileExists(FileName) Then
        Set objFSO = Nothing
        Kill FileName
    End If 
  3. Копирование файла из сетевого расположения

  4. Установить обновленную надстройку

При достижении шага 2 любая попытка удаления файла после удаления с использованием FileSystemObject или прямой Kill неизбежно приводит к Run-time error '70': Permission denied. Если я нажимаю «Отладка» и затем играю, он проходит так, как будто никогда не было проблем.

Примечание: я понимаю, что могу использовать FSO для перезаписи локального файла, но это дает мне ту же ошибку во время выполнения.

Я предполагаю, что проблема связана с некоторым аспектом используемого файла, но я не могу понять, как "выпустить" старую надстройку, чтобы можно было удалить основной файл.

У кого-нибудь есть понимание, которое может помочь?

Ответы [ 2 ]

1 голос
/ 03 августа 2010

Вам нужно удалить его из коллекции дополнений, прежде чем его можно будет физически удалить. Поставьте это сразу после вашего End With:

Application.AddIns.Remove objAddIn.Name
0 голосов
/ 10 марта 2011

Статья KB, которая относится к функции VBA, которую вы можете использовать для ПРОВЕРКИ заблокированного файла, находится здесь. http://support.microsoft.com/kb/209189

Он содержит простую функцию, которую вы можете добавить в свой VBA для проверки того, что файл не заблокирован, и использует тот же пример кода, на который ссылается Отаку в своем ответе.

Что бы я сделал, это ...

Замените строку Kill Filename в вашем коде

If FileLocked(Filename) = True Then  
SetAttr Filename, vbNormal  
Kill Filename  
End If

* Где FileLocked - это пользовательская функция, упомянутая в KB209189
** Если это не сработает, ответьте, мы могли бы также рассмотреть замену приведенного выше оператора Kill более низкой функцией Win32, которая делает то же самое (но, возможно, более тщательно). : D

...