在mac上传递c/c++动态库函数并将指针指向VBA

在mac上传递c/c++动态库函数并将指针指向VBA,c++,macos,vba,gcc,dylib,C++,Macos,Vba,Gcc,Dylib,我实际上是在玩c/c++和mac版Excel-2011的VBA接口。如何在动态库中设计以指针作为参数或引用的函数?还是阵列?甚至是简单的结构?在windows下,VARIANT让我做所有事情,但我不能在OSX下甚至linux下使用它 正如注释所示,到目前为止,我可以对简单类型进行如下操作: 我有以下代码配置:在tmp3class.h中: class TheClass { public: double mysum(double x ,double y); };

我实际上是在玩c/c++和mac版Excel-2011的VBA接口。如何在动态库中设计以指针作为参数或引用的函数?还是阵列?甚至是简单的结构?在windows下,VARIANT让我做所有事情,但我不能在OSX下甚至linux下使用它

正如注释所示,到目前为止,我可以对简单类型进行如下操作:

我有以下代码配置:在tmp3class.h中:

class TheClass
{
      public:
            double mysum(double x ,double y);
};
在tmp3class.cpp中:

#include "./tmp3class.h"

double TheClass::mysum(double x ,double y)
{
      return x+y ;
}
在tmp3.cpp中:

#include "./tmp3class.h"

extern "C"
{
      double THESUM(double x, double y)
      {
            TheClass TheObj ;
            double res = TheObj.mysum(x,y);
            return res ;
      }
}
我用以下方法编译此文件:

g++-5.2.0 -m32 -Wall -g -c ./tmp3class.cpp -o ./tmp3obj.o
g++-5.2.0 -m32 -dynamiclib .tmp3.cpp ./tmp3obj.o -o ./tmp3.dylib
然后在vba中,我执行以下操作:

Declare Function THESUM Lib "/Users/XXXXXX/Documents/GITHUBRepos/DYLIBS/MyFirstDylib/tmp3.dylib" (ByVal x As Double, ByVal y As Double) As Double

Function THESUM_VBA(x As Double, y As Double) As Double
    THESUM_VBA = THESUM(x, y)
End Function

函数的作用非常好。

< P>这里是一个设计的感谢,在数组的情况下:通过一个从C++到AEXE-2011的MAC VBA的数组,C++函数应该在其签名中有双*,表示指向数组的第一个系数的指针,表示数组大小的int、long或etc。例如,一个函数数组,并将其所有系数乘以一个参数值,都会被这样编码:C++代码是:

extern "C"
{
      void multarray(double * array, int size, double coeff)
      {
            for (int i = 0 ; i < size ; ++i)
            {
                  array[i]*=coeff;
            }
      }
}
现在,VBA应参考动态库,如下所示:

Declare Sub multarray Lib "/Users/XXXXXX/Documents/GITHUBRepos/DYLIBS/MyFirstDylib/tmp4.dylib" (ByRef firstcoeff As Double, ByVal size As Long, ByVal coeff As Double)
multarray的第一个参数表示数组的第一个系数,必须通过引用传递。以下是一个利用率示例:

Public Sub DoIt()
    Dim multarraofdoubles(3) As Double
    multarraofdoubles(0) = -1.3
    multarraofdoubles(1) = 4.6
    multarraofdoubles(2) = -0.67
    multarraofdoubles(3) = 3.13
    Dim coeff As Double
    coeff = 2#
    Call multarray(multarraofdoubles(0), 4, coeff)
End Sub
前面提到的包含许多其他有趣的示例,例如带有BSTR的字符串、字符串数组、简单结构等,这些示例可以很容易地适应gcc和这个mac OS/linux上下文。我正在考虑设计一个简单的VARIANTclass来处理所有这些

Public Sub DoIt()
    Dim multarraofdoubles(3) As Double
    multarraofdoubles(0) = -1.3
    multarraofdoubles(1) = 4.6
    multarraofdoubles(2) = -0.67
    multarraofdoubles(3) = 3.13
    Dim coeff As Double
    coeff = 2#
    Call multarray(multarraofdoubles(0), 4, coeff)
End Sub