【问题标题】:How to use dll's in the same directory as an excel file如何在与excel文件相同的目录中使用dll
【发布时间】:2009-06-09 16:59:43
【问题描述】:

这和我的other question有点关系。

我一直在使用 dll 来配合 Excel 电子表格。目前一切都在使用 dll 并且 excel 使用它就好了。但是在声明函数时是否可以指定dll与excel文件位于同一目录下?

Declare Sub FortranCall Lib "Fcall.dll" (r1 As Long, ByVal num As String)

不幸的是,这不起作用,我必须使用类似的东西:

Declare Sub FortranCall Lib "C:\temp\Fcall.dll" (r1 As Long, ByVal num As String)

这可行,但在分发给我的办公室同事时会引起头痛。将 dll 放在 c:\windows\system32 等中也不是一个真正的选择。

【问题讨论】:

  • 嗨,你最后选择了什么?

标签: windows excel dll


【解决方案1】:

这里是three possibilities,用于从 VBA 动态加载/调用 DLL,包括相关信息的链接和一些示例代码。不能说我曾经不得不使用那里描述的任何解决方案,但鉴于 VBA 需要静态路径,这似乎是对选项的合理探索。

  1. 使用 VBIDE 可扩展性 API 在运行时创建一个新模块(您可以从磁盘导入一个 .bas 文件,无需使用字符串文字对模块进行硬编码)。缺点:没有编译时验证;您需要使用字符串类型的Application.Run 调用来调用它。需要对 VBIDE API 进行受信任的编程访问(即,您允许 VBA 执行生成代码然后执行的代码……就像宏病毒一样)。
  2. 使用LoadLibrary Win32 API...现在您已经获得了指针和地址:this scary code(.zip 下载)本质上是一个巨大的不可维护的 hack,它使用汇编语言来启用按名称调用 API 函数。看起来它只适用于受支持的 Win32 API 函数的子集。
  3. 更改 DLL 搜索路径,但那需要在运行时添加动态代码,所以还不如按照上面的。

another potential solution 建议在调用 DLL 之前以编程方式更新 PATH 环境变量。如果可行,这不是一个坏主意,因为您可以将其添加到您的工作簿打开事件中。

祝你好运!

【讨论】:

  • 不幸的是,关于更新 PATH 的链接已失效
  • 上面的第二个死链接,看起来他们在某个时候重新组织并且没有提供重定向。我不能确定这是同一篇文章,但它似乎是主题(有关详细信息,请参阅 cmets):communities.bentley.com/products/microstation/f/…
【解决方案2】:

我通常处理这个问题的方法是添加:

Dim CurrentPath As String
CurrentPath = CurDir()   
ChDir (ThisWorkbook.Path)

收件人:私有子 Workbook_Open()

【讨论】:

    【解决方案3】:

    ChDir() 应该可以解决问题。但它可能不适用于网络文件夹。

    Declare Sub FortranCall Lib "Fcall.dll" (r1 As Long, ByVal num As String)
    ...
    Dim CurrentPath As String
    CurrentPath = CurDir()   
    ChDir (ThisWorkbook.Path)
    Call FortranCall(r, n)
    ChDir (CurrentPath) ' Change back to original directory
    

    现在将 .dll 保存在与工作簿相同的文件夹中。

    【讨论】:

      【解决方案4】:

      您可以将 DLL 放在某个目录中并将其添加到路径 EnVar。

      【讨论】:

      • 拜托,你能解释一下你的意思。您的意思是我将 DLL 添加到 PATH 环境变量中吗?恐怕这不是一个令人满意的解决方案——在这种情况下,只要求他们将 excel 和 dll 文件保存在预定义的目录结构中会更容易。我正在尝试尽可能多地完成“便携式”解决方案。
      【解决方案5】:

      ActiveWorkbook.Path 为您提供包含当前活动工作簿的文件夹的完整路径。所以试试这个:

      Declare Sub FortranCall Lib ActiveWorkbook.Path & "\Fcall.dll" (r1 As Long, ByVal num As String)
      

      【讨论】:

      • Excel 报告 ActiveWorkbook.Path 的“编译错误,预期的字符串常量”?你也许知道那是什么意思(我不太了解VB,所以这可能是微不足道的......)
      • 表示对于Declare语句,需要一个常量字符串——而ActiveWorkbook.Path是函数调用(或属性),所以不能使用。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-22
      • 2014-11-08
      • 2021-10-15
      • 2018-07-05
      相关资源
      最近更新 更多