在 mac 上传递 c/c++ dylib 函数获取指向 VBA 的指针
passing c/c++ dylib function taking pointer to VBA on mac
我实际上正在玩接口 c/c++ 和 Excel-2011 的 VBA for mac。我如何在 dylib 中设计将指针作为参数或引用的函数?还是数组?或者甚至是简单的结构?在windows下,VARIANT
让我做所有事情,但在OS X(甚至在linux)下我不能求助于它。
正如评论一样,到目前为止,我可以为(涉及 "simple" 类型)做这样的事情:
我有以下代码配置:在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
运行良好。
这是数组情况下的一个答案(感谢 this 设计):将数组(双精度)从 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
前面提到的 link 包含许多其他有趣的示例,对于字符串(带有 BSTR
's)、字符串数组、简单结构等,可以很容易地适应 gcc
和这个 mac OS (/linux) 上下文。我正在考虑设计一个简单的 VARIANT
class 来处理所有这些。
我实际上正在玩接口 c/c++ 和 Excel-2011 的 VBA for mac。我如何在 dylib 中设计将指针作为参数或引用的函数?还是数组?或者甚至是简单的结构?在windows下,VARIANT
让我做所有事情,但在OS X(甚至在linux)下我不能求助于它。
正如评论一样,到目前为止,我可以为(涉及 "simple" 类型)做这样的事情:
我有以下代码配置:在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
运行良好。
这是数组情况下的一个答案(感谢 this 设计):将数组(双精度)从 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
前面提到的 link 包含许多其他有趣的示例,对于字符串(带有 BSTR
's)、字符串数组、简单结构等,可以很容易地适应 gcc
和这个 mac OS (/linux) 上下文。我正在考虑设计一个简单的 VARIANT
class 来处理所有这些。