我实际上正在玩c/c++接口和Excel-2011 mac的VBA接口。如何在dylib中设计以指针为参数或引用的函数?还是阵列?甚至是简单的结构?在windows下,VARIANT让我做所有事情,但是我不能在OS下(甚至在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 FunctionTHESUM_VBA函数运行得非常好。
发布于 2015-08-30 14:08:00
对于数组,这里有一个答案(设计感谢这):为了将一个数组从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 (/linux)上下文。
https://stackoverflow.com/questions/32237575
复制相似问题