【问题标题】:#VALUE! when calling DLL function (C++) in 64-bit Excel#价值!在 64 位 Excel 中调用 DLL 函数 (C++) 时
【发布时间】:2018-09-17 15:29:43
【问题描述】:

我对 C-plus-plus 很陌生,并试图用它来为 excel 创建用户定义的函数。我在 Cpp 中编写了一个非常简单的测试函数,它只是将两个参数加在一起(Excel 单元格引用)。

我在 Visual Studio 2013 中使用相同的 *.cpp 和 *.def 文件编译了一个 32 位 DLL 和一个单独的 64 位 DLL 项目。

当我在 32 位 Excel 安装上运行 32 位 DLL 时,新的 excel 函数工作正常(例如:5 + 10 = 15)。

当我在 64 位 Excel 安装上运行 64 位 DLL 时,单元格中出现 #VALUE 错误。

任何人都可以看到我在使用 64 位 DLL 时出现的明显错误吗?谢谢!

***** VBA (32-bit) *****
Declare Function ExPlus Lib _
"C:\AKH-VSWS\Ex-Plus32\Debug\Ex-Plus32.dll" _
(ByVal a As Double, _
 ByVal b As Double) As Double

计算机 1:Windows 7(64 位)、Office 2016(32 位)、Visual Studio 2013

***** VBA (64-bit) *****
Declare PtrSafe Function ExPlus Lib _
"C:\AKH-VSWS\Ex-Plus64\x64\Debug\Ex-Plus64.dll" _
(ByVal a As Double, _
 ByVal b As Double) As Double

计算机 2:Windows 7(64 位)、Office 2016(64 位)

Microsoft (R) COFF/PE Dumper Version 12.00.21005.1
Copyright (C) Microsoft Corporation.  All rights reserved.

Dump of file c:\AKH-VSWS\Ex-Plus64\x64\Debug\Ex-Plus64.dll
PE signature found
File Type: DLL

FILE HEADER VALUES
            8664 machine (x64)
               7 number of sections
        5AC930F1 time date stamp Sat Apr 07 16:58:25 2018
               0 file pointer to symbol table
               0 number of symbols
              F0 size of optional header
            2022 characteristics
                   Executable
                   Application can handle large (>2GB) addresses
                   DLL

【问题讨论】:

  • 您不能使用 C++ 构建导出 COM 类型或 C 样式函数的 DLL 文件并使其在 32 位和 64 位环境中工作。
  • @ashleedawg,如果我正确阅读了您的评论,那么您是正确的。 DLL 不会在 voth 世界中工作。我有两个单独的 VStudio 项目。 1 编译一个 32 位的 DLL。和 1 编译一个单独的 64 位 DLL。 32 位按预期工作,但 64 位函数在 Excel 中返​​回错误。我不知道它是编译器错误还是 VBA 错误...建议?从哪里/如何开始调试?

标签: c++ excel visual-studio-2013 32bit-64bit vba


【解决方案1】:

这不是一个解决方案,但它可能是朝着正确方向迈出的一步......我今天碰巧偶然发现了一个页面。并且推荐的软件似乎认为我的DLL找不到依赖项(MSVCR120D.DLL)。所以我需要进一步研究。

...尽管如此...仍然愿意接受建议...

http://access.mvps.org/access/bugs/bugs0019.htm

这是由于您的依赖文件(运行时文件)丢失造成的 DLL 所需的机器。错误消息“找不到文件” 不是由 DLL 文件本身生成,而是 Access 因为它 找不到其他所需的 DLL。

要查明 DLL 是否有任何依赖项,您可以使用其中一种 两种方法...下载 Dependency Walker 在您的硬盘上搜索 任何依赖文件,并确保它们存在并已注册。

Dependency Walker screenshot

【讨论】:

    【解决方案2】:

    情节变厚了……

    看来我已经在“调试”模式下编译,可能需要将 Visual Studio 设置从“调试”更改为其他设置。

    VS2012 MSVCR120D.dll is missing

    "..."D" 代表调试信息...调试 DLL 仅提供 使用各自版本的 Visual Studio,并不意味着 重新分配...”

    【讨论】:

      【解决方案3】:

      我想我知道我的问题是什么了......

      我在调试器模式下编译它,所以它在其中一个依赖文件的名称上添加了“D”。当我将 DLL 移到没有 Visual Studio 的计算机上时,它就无法运行。我不得不将我的编译设置切换到发布模式。

      在 *.cpp 文件中,我在 __stdcall 语句中缺少两个下划线 (_) 之一。而 Visual Studio 的调试器,我并没有抓住它。所以用户定义的函数没有与 DLL 一起导出。

      我也没有在 Visual Studio 中正确注册/设置 *.def 文件。因此,即使 __stdcall 语句是正确的,该函数仍然不会正确导出。

      显然,如果您不以某种方式在 excel/windows 中注册 UDF,则需要通过本地 VBA 函数运行 C++/DLL 函数。我必须阅读(XLL 和所有有趣的东西)。

      所以,总而言之,是的……我是愚蠢的。

      【讨论】:

        猜你喜欢
        • 2015-09-17
        • 2011-12-21
        • 2020-09-21
        • 1970-01-01
        • 2015-01-07
        • 2013-11-04
        • 1970-01-01
        • 2019-03-07
        • 2018-01-26
        相关资源
        最近更新 更多