在mac上传递c/c++ dylib函数,将指针指向VBA
passing c/c++ dylib function taking pointer to VBA on mac
我实际上是在玩接口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
类处理所有这些
相关文章:
- QMetaObject invokeMethod的基于函数指针的语法
- C++-试图将函数指针推回到另一个CPP文件中的矢量时出错
- c++r值引用应用于函数指针
- 模板函数指针和lambda
- 是否可以将llvm::FunctionType转换为C/C++原始函数指针
- 带有类的函数指针
- () 函子后面的括号,而不是函数指针?
- 全局作用域中函数指针的赋值
- 使用"Task"函数指针队列定义作业管理器
- 将成员函数指针作为参数传递给模板方法
- 如何创建对象函数指针C++映射?
- 匹配函数指针作为模板参数?
- 通过函数指针定义类范围之外的方法
- 存储在类中的函数指针
- C++从函数指针数组调用函数
- 将返回值存储在函数指针数组的指针中是如何工作的?
- 整数键映射到头文件中的成员函数指针
- 从类成员函数到类 C 函数指针的转换
- 如何将内联匿名函数分配给C++函数指针
- 将字符缓冲区强制转换为函数指针