Передача c/ C++ функции dylib с указателем на VBA на Mac

Я на самом деле играю с интерфейсом C / C++ и VBA Excel-2011 для Mac. Как я могу создать в dylib функции, принимающие указатели в качестве параметров или ссылки? Или массивы? Или даже простые структуры? Под окнами, VARIANT давайте сделаем все, но я не могу прибегнуть к этому под OS X (или даже под 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

и функция THESUM_VBA работает на отлично

1 ответ

Решение

Вот ответ (спроектированный благодаря этому) в случае массивов: для передачи массива (double) из C++ в VBA Excel (2011) (mac) функция C++ должна иметь в своей сигнатуре a 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

Вышеупомянутая ссылка содержит много других интересных примеров, для строк (с BSTRs), массив строк, простые структуры и т. д., которые можно легко адаптировать к gcc и этот контекст Mac OS (/ Linux). Я думаю о разработке простого VARIANTКласс, обрабатывающий все это.

Другие вопросы по тегам