2015-08-26 117 views
0

实际上,我正在玩接口c/C++和Excel-2011 for mac的VBA。我怎么能在dylib中设计以指针为参数或引用的函数?或数组?甚至是简单的结构?在windows下,VARIANT让我来做所有事情,但是我不能在OS X(甚至是Linux下)下使用它。传递c/C++ dylib函数将指针指向VBA上的指针

正如评论,到现在为止,我可以(包括“简单”型)做这样的事情:

我有下面的代码配置:在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 

THESUM_VBA很完善的功能。

回答

0

这里是一个答案在阵列的情况下(被设计感谢到this):通过从C++的阵列(双)练成-2011的(MAC)VBA,C++函数应该在其签名double *代表指向数组的第一个系数的指针,int(或long等),表示数组大小。例如,服用的阵列,并且由一个参数值的所有系数相乘的功能将被编码的是这样的:C++代码是:

extern "C" 
{ 
     void multarray(double * array, int size, double coeff) 
     { 
      for (int i = 0 ; i < size ; ++i) 
      { 
        array[i]*=coeff; 
      } 
     } 
} 

编译:

g++ -m32 -Wall -g -c ./tmp4.cpp 
g++ -m32 -dynamiclib ./tmp4.o -o ./tmp4.dylib 

现在VBA应引用所述dylib如下:

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的第一个参数代表阵列,的第一系数,并且必须由REF被传递erence。下面是利用的为例:

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 

上述link包含许多其他有趣的例子中,用于字符串(与BSTR的),字符串数组,简单结构等,能够很容易地适应gcc和本MAC OS(/ linux)上下文。我正在考虑设计一个简单的VARIANT类来处理所有这些。