#值!在64位Excel

时间:2018-04-07 22:20:13

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

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

我编译了一个32位DLL& Visual Studio 2013中使用相同* .cpp和* .def文件的单独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

3 个答案:

答案 0 :(得分:0)

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

......仍然愿意接受建议,但是......

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

  

这是由您的依赖项文件(运行时文件)丢失引起的   DLL所需的机器。错误消息“找不到文件”   不是由DLL文件本身生成的,而是自己生成的   无法找到其他所需的DLL。

     

要确定DLL是否具有任何依赖关系,您可以使用其中一个   两种方法...下载Dependency Walker搜索你的硬盘   任何相关文件,并确保它们存在并注册。

Dependency Walker screenshot

答案 1 :(得分:0)

情节变浓......

似乎我编译了" debug"模式,可能必须从" debug"更改Visual Studio设置。别的什么。

VS2012 MSVCR120D.dll is missing

  

" ..." D"代表调试信息......调试DLL只有   使用相应版本的Visual Studio,并不意味着   再分配..."

答案 2 :(得分:0)

我想我弄明白了我的问题......

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

在* .cpp文件中,我错过了__stdcall语句中的两个下划线(_)之一。 Visual Studio的调试器和我没有抓住它。因此,用户定义的函数没有与DLL一起导出。

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

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

所以,总之,是的......我是愚蠢的。