不信任对VBA项目的编程访问(选项已勾选,Word 2013)

时间:2016-03-14 16:43:50

标签: vb.net vba ms-word vsto

详情

  • 加载项类型:VSTO(VB.Net)
  • Word Version:2013

症状

当我尝试在插件Normal.dotm事件期间将VBA模块注入用户的Startup模板时,即使选中该选项,也会出现VBA project is not trusted错误。当我尝试从模板中获取VBProject对象时会发生这种情况:

Private Sub ThisAddIn_Startup() Handles Me.Startup
    Dim template as Word.Template = GetNormalTemplate()
    If template IsNot nothing Then
        Dim vbProj = template.VBProject 'Error thrown here
    End If
End Sub

仅在勾选General选项Show the start screen when this application starts时才会发生这种情况。

出于某种原因,即使在 splash 屏幕期间加载了普通模板,在实际显示文档之前, start 屏幕上的VBProject也不可用(空白或其他)。

结果

我设法通过在WindowActivate事件第一次触发时运行代码而不是在加载项的Startup事件期间运行代码来获得我的目标:

Property hasInjectedVba As Boolean = False
Private Sub WindowHasActivated() Handles Application.WindowActivate
    If Not hasInjectedVba Then
        Try
            injectVba()
            hasInjectedVba = True
        Catch ex As Exception
            'handle the something that went wrong
        End Try
    End If
End Sub

摘要
如果您正在尝试安全,那么Cindy会提出一些非常好的观点,如果您使用插件模板,那么最重要的是The security measure not allowing programmatic access to VB projects can remain in-place - 这样可以完全避免这个问题。

1 个答案:

答案 0 :(得分:0)

您应该考虑明确创建一个模板(* .dotm),以便与您的加载项进行交互,而不是将代码注入到用户的Normal.dotm中。

除了COM加载项(VSTO利用的技术)之外,Word还支持"模板加载项"。这些可以安装在Word Start-up文件夹中,以便Word始终自动加载它们,或者您可以选择明确加载(和卸载)加载项。

在Word对象模型中,这是Addins集合。它镜像对话框"模板和加载项"在Word UI中。

除了一些" Auto"宏,任何代码(和RibbonXML扩展)在"加载项模板"行为与Normal.dotm中的代码相同。

使用加载项模板而不是Normal.dotm的优点:

  • 如果Normal.dotm损坏或更换,则不会影响您的代码
  • 您不需要在每次启动时都进行代码检查,修改是否存在于Normal.dotm中,如果不是
  • 则将其恢复
  • 不允许以编程方式访问VB项目的安全措施可以保留就地
  • 你不必担心臭名昭着的#34; Normal.dotm被另一个进程锁定了#34;当Word崩溃或用户多次登录时可能发生这种情况
  • 保护代码不被用户修改
  • 如果您需要更改代码,则易于维护
  • 您可以使用网络位置中的单个共享模板进行管理