Передача 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
Вышеупомянутая ссылка содержит много других интересных примеров, для строк (с BSTR
s), массив строк, простые структуры и т. д., которые можно легко адаптировать к gcc
и этот контекст Mac OS (/ Linux). Я думаю о разработке простого VARIANT
Класс, обрабатывающий все это.