You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

64位Excel VBA调用C++ DLL加法函数返回0的问题求助

问题描述

使用64位Excel 2206(内部版本16.0.15330.20260)与Visual Studio Community 2022,在VBA中调用C++编写的DLL函数时,单参数平方函数可正常运行,但双参数加法函数在Excel中调用包装函数时始终返回0。

C++代码

源文件

#include "pch.h"
#include "SquareLib.h"

double WINAPI get_square(double* x) // 教程中的可用函数
{
    return *x * *x;
}

double WINAPI add_nums(double* x, double* y) // 自定义加法函数
{
    return *x + *y;
}

头文件

#pragma once

#ifdef SQUARELIB_EXPORTS
#define SQUARELIB_API __declspec(dllexport)
#else
#define SQUARELIB_API __declspec(dllimport)
#endif


extern "C" SQUARELIB_API double get_square(double* x);
extern "C" SQUARELIB_API double add_nums(double* x, double* y);

VBA代码

Declare PtrSafe Function get_square_cpp _
  Lib "C:\Users\artil\source\repos\SquareLib\x64\Debug\SquareLib.dll" Alias "get_square" _
  (ByRef my_var As Double) As Double

Declare PtrSafe Function add_nums_cpp _
  Lib "C:\Users\artil\source\repos\SquareLib\x64\Debug\SquareLib.dll" Alias "add_nums" _
  (ByRef x As Double, ByRef y As Double) As Double

Function get_square(x As Double) ' 平方包装函数
    get_square = get_square_cpp(x)
End Function

Function add_num(x As Double, y As Double) ' 加法包装函数
    add_nums = add_nums_cpp(x, y)
End Function
问题排查与修复
  • 核心错误:VBA包装函数赋值错误
    加法包装函数add_num中,结果被错误赋值给未定义的add_nums,而非函数本身add_num。VBA中未显式为函数名赋值时,会默认返回0,这就是问题根源。修复后的包装函数代码:

    Function add_num(x As Double, y As Double) ' 加法包装函数
        add_num = add_nums_cpp(x, y)
    End Function
    
  • 额外验证建议

    • 确认DLL编译为x64版本,与Excel位数匹配(当前已满足)。
    • 检查函数导出情况:在VS命令行中执行dumpbin /exports SquareLib.dll,查看导出表确认add_nums是否正确导出。
    • 参数传递验证:VBA中ByRef对应C++的指针参数,当前Declare语句的参数传递方式是正确的,无需调整。

内容的提问来源于stack exchange,提问作者azncookiethief

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 13:24:49