在mac上传递c/c++ dylib函数,将指针指向VBA

passing c/c++ dylib function taking pointer to VBA on mac

本文关键字:函数 指针 VBA dylib c++ mac      更新时间:2023-10-16

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

就像注释一样,到目前为止,我可以做这样的事情(涉及"简单"类型):

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

in tmp3class.cpp:

#include "./tmp3class.h"
double TheClass::mysum(double x ,double y)
{
      return x+y ;
}

and in 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功能运行良好。

这是一个答案(设计感谢这一点)在数组的情况下:传递数组(双)从c++到excel-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的第一个参数表示数组的第一个系数,必须通过引用传递。下面是一个使用的例子:

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)上下文。我正在考虑设计一个简单的VARIANT类处理所有这些