【问题标题】:using C++ 2010 dll in excel在 Excel 中使用 C++ 2010 dll
【发布时间】:2013-04-14 23:02:28
【问题描述】:

我使用 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

【问题讨论】:

  • 你在.def文件中声明了导出函数吗?
  • 我没有 .def 文件。据我了解,使用 __deslspec(dllexport) 关键字消除了在 DEF 文件中列出函数的需要。
  • 是的,但在任何情况下您都可以拥有 .defs 文件。也让你的所有功能都是静态的
  • 我对Excel宏不太了解,但是参数列表中的ByRef看起来不对。我认为您应该改为传递您的论点 ByVal。

标签: c++ visual-studio-2010 excel dll


【解决方案1】:

您的进口声明是错误的。两件事:类型的语义和声明。如果你在 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

使您的函数返回要导出的类的日期成员,静态成员。 也让你的函数静态,在任何情况下,你都可以在 .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;
      }

在所有这些更改之后应该没问题。

【讨论】:

  • 所以我将成员函数设为静态以及“returndates”函数。我在 excel 宏中更改为 ByVal,并创建了一个包含以下内容的 DEF 文件: LIBRARY "SwapFunDLL" EXPORTS returndates 这导致程序不再构建
  • 只放导出函数的名称
  • k 改变了,它的构建再次但仍然没有让它在 excel 中工作的运气(仍然是一个值错误)
  • 查看编辑,并确保该函数完全像 C++ 函数一样工作
  • 对不起,我不明白
猜你喜欢
  • 2011-04-03
  • 1970-01-01
  • 2016-06-10
  • 2011-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多