问题

  • 我有一个单词模板,该模板使用VBA的Declare语句链接到dll,其路径可以在VBA宏
  • 中确定
  • 我想将此部署到用户%APPDATA%\Microsoft\Word\STARTUP目录
  • 我不想永久更改用户的PATH环境变量(暂时可以,但是这似乎不起作用,因为在应用程序重新启动之前它们不会得到刷新)

    尝试的解决方案

    我尝试使用Declare动态添加带有ThisDocument.VBProject.CodeModule.AddFromString(code)语句的代码,该代码在从普通目录加载模板时有效,但是当模板在Word\STARTUP中时,会出现以下错误:



    当模板位于Word\STARTUP中时,将注册表项“HKEY ___ LOCAL_MACHINE\Software\Microsoft\Office\11.0\Word\Security\AccessVBOM”设置为1并不能解决此问题。

    我真的很努力寻找解决方案。如果有人知道这样做的方法,那就太好了。

    最佳答案

    坦白说,我不知道使用所有这些VBA代码注入(inject),LoadLibrary()调用的程序集生成等问题,以及我见过的用于此简单任务的技术。在我的项目中,我使用简单的代码从与工作簿相同的位置加载dll,如下所示:

    Declare Function MyFunc Lib "MyDll.dll" (....) As ...
    
    Sub Test()
      ....
      ChDir ActiveWorkbook.Path
      ... = MyFunc(....)
    End Sub
    

    至少Excel 2003不会从当前路径加载dll,将ChDir设置为您的DLL具有的任何路径都没有问题。您可能还需要更改与当前路径分开的当前驱动器。无论您当前的路径在哪里,您都只需要在第一次函数调用之前执行一次,在此之后DLL保持连接状态,因此您可以在workbook_open中执行一次,而以后不再理会该路径。为此,我在DLL中提供了一个空的伪函数。我认为MS Word在这方面没有什么不同。
    Private Declare Sub Dummy Lib "MyDLL.dll" ()
    
    Private Sub Workbook_Open()
        ChDrive Left$(Me.Path, 1)
        ChDir Me.Path
        Dummy
    End Sub
    

    关于vba - 在VBA宏中以编程方式设置DLL搜索路径,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/450177/

  • 10-17 02:37