如何分发 PowerPoint AddIn/PPAM 同时仍能更新

How to distribute PowerPoint AddIn/PPAM while still able to update

我已经开发了一个自定义的 PowerPoint 加载项,我正试图想出一个解决方案来以简单的方式分发它。
我最初的计划是将插件 (.ppam) 放在中央驱动器中,让用户从那里添加它,不幸的是,我似乎无法更新它,那就是在现有位置保存它的新副本,如果用户已打开它(尽管已将其设置为只读)。这可以通过如下脚本使用 Excel 插件来完成。

Sub DeployAddIn()
'Test
Dim strNewName As String
'Author       : Ken Puls (www.excelguru.ca)
'Macro Purpose: To deploy finished/updated add-in to a network
'               location as a read only file
    Dim strAddinDevelopmentPath As String
    Dim strAddinPublicPath As String

    'Set development and public paths
    strAddinDevelopmentPath = ThisWorkbook.Path & Application.PathSeparator
    strAddinPublicPath = "C:\Public Path" & Application.PathSeparator

    'Turn off alert regarding overwriting existing files
    Application.DisplayAlerts = False


    'Save the add-in
    With ThisWorkbook
    strNewName = Left(.Name, InStrRev(.Name, "-") - 1) & "." & Right(.Name, (Len(.Name) - InStrRev(.Name, ".")))
        'Save to ensure work is okay in case of a crash
        .Save

        'Save read only copy to the network (remove read only property
        'save the file and reapply the read only status)
        On Error Resume Next
        SetAttr strAddinPublicPath & strNewName, vbNormal
        On Error GoTo 0
        .SaveCopyAs FileName:=strAddinPublicPath & strNewName
        SetAttr strAddinPublicPath & strNewName, vbReadOnly
    End With

    'Resume alerts
    Application.DisplayAlerts = True
End Sub

有人对如何巧妙地分发 PowerPoint 插件有任何想法吗?

编辑:更新了解决方案
我最终使用了一个由两部分组成的插件,因为我不能确定允许用户访问 运行 EXE/MSI 文件。基本上我的构建就像

Const strCentralPath As String = Central path

Sub Auto_Open()
Dim objAddins As AddIns
Dim objAddIn As AddIn
Dim dblCurrentVersion As Double
Dim dblMyVersion As Double

Set objAddins = Application.AddIns
'Check if Addin is already added and loaded.
'If it is, check if version is same as local.
For Each objAddIn In objAddins
    If objAddIn.Name = "Name of addin" Then
        If objAddIn.Loaded = msoCTrue Then objAddIn.Loaded = msoCTrue
        GoTo CheckVersion
    End If

Next objAddIn

'If addin is not found add it
Call AddAddin
GoTo ExitLine


'Check version
CheckVersion:
dblCurrentVersion = Version(strCentralPath)
dblMyVersion = Version(local path)

If dblCurrentVersion > dblMyVersion Then
    Application.AddIns(Name of addin).Loaded = msoFalse
    Call AddAddin 'If version is lower, unload and add the the new one.
End If

ExitLine:

Set objAddins = Nothing


End Sub

Function Version(Path As String) As Double

Dim fso As Object
Dim dblDate As Integer

Set fso = CreateObject("scripting.filesystemobject")
intDate = CDbl(fso.GetFile(Path).DateCreated)
Version = intDate

Set fso = Nothing


End Function

Sub AddAddin()
Dim strAddInLocalPath As String
Dim strAddinCentralPath As String
Dim fso As Object

'Get local path
strAddInLocalPath = local path

Set fso = VBA.CreateObject("scripting.Filesystemobject")

DeleteFile strAddInLocalPath

Call fso.CopyFile(strCentralPath, strAddInLocalPath, True)
SetAttr strAddInLocalPath, vbReadOnly

With Application.AddIns.Add(strAddInLocalPath)
    .Loaded = msoCTrue
End With

Set fso = Nothing

End Sub

Sub DeleteFile(ByVal FileToDelete As String)
   If FileExists(FileToDelete) Then 'See above
      SetAttr FileToDelete, vbNormal
      Kill FileToDelete
   End If
End Sub

Function FileExists(ByVal FileToTest As String) As Boolean
   FileExists = (Dir(FileToTest) <> "")
End Function

我知道我很快需要面对同样的问题,并且一直在考虑两种选择。首先将加载项构建到 MSI 安装程序包中,我相信它可以自动管理此更新元素(我正在评估 the Advanced Installer solution)。其次,我想知道我是否可以构建一个包含两个加载项的体系结构,其中第一个加载项没有任何 UI,它的唯一目的是从远程位置下载主要的加载项。但是,我不认为有一种方法可以确定应用程序加载项的加载顺序(即使它似乎是按字母顺序排列的)。我想这就是你想要做的?

我不会尝试让多个用户加载同一个加载项文件。

如果用户可以双击 EXE 或 MSI 安装程序,这是分发更新的一种方式。由于提到了 Advanced Installer,我将补充说它会生成任何一个,并且是一个 非常 的工具,并且得到很好的支持。

另一种方法是让登录脚本将插件的当前版本从集中位置下载到每个用户的本地计算机。然后它会在用户启动PPT之前在系统上,所以没有冲突。

理论上,您可以安装插件 A,当它自动运行时,它会查看插件 B PPA/PPAM 文件的日期,如果有更新的版本 "Out There" ,将其复制到本地加载项文件夹。然后无论哪种方式,按需加载 Addin B,它完成真正的工作。当我认为以前的方法同样有效时,似乎要经历很多麻烦。