【问题标题】:Calling a DLL function from vba excel 64 bit从 vba excel 64 位调用 DLL 函数
【发布时间】:2015-09-17 11:25:38
【问题描述】:

我在使用 vba Excel 64 位 (Win8) 中的 DLL 函数时遇到问题。 当我强制从绝对 DLL 路径加载函数声明时,如下所示,没有问题,我的代码运行良好。

Private Declare PtrSafe Function get_Ith Lib "MYPATH\CVode.dll" (ByVal lpv As LongPtr, ByVal i As LongPtr) As Double

但是,我不想要绝对路径。因此,我将 dll 文件放在 excel 文件旁边(在同一文件夹中)并声明如下函数:

Private Declare PtrSafe Function get_Ith Lib "CVode.dll" (ByVal lpv As LongPtr, ByVal i As LongPtr) As Double

然后我在 Excel 表的 Workbook_Open 中包含以下语句。

Private Sub Workbook_Open()
  ChDrive ThisWorkbook.Path
  ChDir ThisWorkbook.Path

结束子

我一直在将此方法用于此 dll(但较新版本)以及其他项目,没有任何问题。 但是现在 vba 从 dll 函数返回一些不相关的值,我的程序会爆炸。 顺便说一句,dll 是用 c++ 编写的,我有源代码。源代码中有.def文件将所有功能导出到外部程序。
如果你能帮助我,我将不胜感激

【问题讨论】:

    标签: c++ excel vba dll windows-8


    【解决方案1】:

    我不认为这是导致问题的路径。要么在没有显式路径时加载了错误的 DLL,要么作为 64 位 DLL 调用的 DLL 实际上是 32 位 DLL。

    请注意,由于 Excel 会在您通过使用错误声明调用 DLL 来破坏堆栈后进行堆栈修复,因此您不会总是看到您创建的错误。确保您在 DLL 代码中声明的指针与您在 64 位 Excel 中使用的指针大小相同。

    【讨论】:

      【解决方案2】:

      还要确保您的调用约定(stdcall 等)正在做正确的事情。您没有使用别名的事实表明至少应该查看您的调用约定。 ByVal 看起来不错。

      另见Calling GetProcAddress from VBA always returns null

      【讨论】:

        猜你喜欢
        • 2020-09-21
        • 2016-06-04
        • 2019-05-19
        • 2018-09-17
        • 1970-01-01
        • 2019-03-07
        • 1970-01-01
        • 2011-12-21
        • 1970-01-01
        相关资源
        最近更新 更多