1

我已经使用 Visual C++ 2010 在 c++ 中构建了一个简单的 dll,并尝试在 excel 中使用它。项目名称为“SwapFunDLL”,源文件名称为“swapmain”,包含类及其函数的头文件名称为“DateNTime”。我已将它们附在下面。代码接受两个值,然后使用类函数将它们相乘,然后返回乘积(我意识到类和函数不是必需的,我这样做只是为了学习)。该函数编译时没有错误,但是当在 excel 中使用该函数时,我得到一个值错误。有人可以帮我看看我做错了什么谢谢。

标题:

// DateNTime.h

//Avoid need of .Def file    
#ifdef SwapFunDLL_EXPORTS
#define SwapFunDLL_API __declspec(dllexport) 
#else
#define SwapFunDLL_API __declspec(dllimport)   
#endif

namespace DateNTime
{
    class SwapFunDLL_API Date
    {
        double x,y;
     public:
        double datediff(double,double);
     };

    double Date::datediff(double x, double y)
    {
        return x*y;
    }
}

源文件:

#include "DateNTime.h"
namespace DateNTime
{
   double returndates(double a, double b)
   {
       Date Date;
       return Date.datediff(a,b);
   }
 }

Excel宏:

Declare Function SwapFunDLL _ Lib "C:\Users\MIKE\Desktop\c++ tial programs\SwapFunDLL\Debug\SwapFunDLL.dll" _ (ByRef x As Double, ByRef y As Double) As Double

4

1 回答 1

0

您的进口声明是错误的。两件事:类型的语义和声明。如果您使用指针而不是在 Excel 中,您会说ByRef,但如果您使用按值传递,您会说ByVal。将此函数声明为:

Declare Function returndates Lib "C:\Users\MIKE\Desktop\c++ tial programs\SwapFunDLL\Debug\SwapFunDLL.dll" _ (ByVal x As Double, ByVal y As Double) As Double

使您的函数 returndates 成为您正在导出的类的静态成员。也让你的函数静态,在任何情况下,你都可以在 .def 文件中声明这个导出(只是简单地:“returdates”就是这样)。毕竟这一切都必须工作,除非你的 C++ 代码是好的。也在这里:

   double returndates(double a, double b)
   {
       Date Date; //<- change it, i.e: Date d; d.datediff(); does it compile? 
       return Date.datediff(a,b);
   }

您可以更改代码只是为了测试您是否对此类“测试信息”表单正确执行了所有操作:

   double returndates(double a, double b)
   {
       return 117;
   }

并在 Excel 中尝试。Excel 需要__stdcall,因此在您的类中进行函数声明,如下所示:

static double __stdcall returndates(double a, double b);

然后在 .cpp 文件中将其定义为:

    SwapFunDLL_API double __stdcall DateNTime::Date::returndtes(double a, double b){
      return 117;
      }

毕竟这些改变应该没问题。

于 2013-04-14T23:40:25.310 回答