首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >传递c/c++ dylib函数,在mac上使用指向VBA的指针

传递c/c++ dylib函数,在mac上使用指向VBA的指针
EN

Stack Overflow用户
提问于 2015-08-26 22:14:07
回答 1查看 441关注 0票数 0

我实际上正在玩c/c++接口和Excel-2011 mac的VBA接口。如何在dylib中设计以指针为参数或引用的函数?还是阵列?甚至是简单的结构?在windows下,VARIANT让我做所有事情,但是我不能在OS下(甚至在linux下)使用它。

正如评论一样,到目前为止,我可以这样做(涉及“简单”类型):

我有以下代码配置:在tmp3class.h中:

代码语言:javascript
复制
class TheClass
{
      public:
            double mysum(double x ,double y);
};

在tmp3class.cpp中:

代码语言:javascript
复制
#include "./tmp3class.h"

double TheClass::mysum(double x ,double y)
{
      return x+y ;
}

在tmp3.cpp中:

代码语言:javascript
复制
#include "./tmp3class.h"

extern "C"
{
      double THESUM(double x, double y)
      {
            TheClass TheObj ;
            double res = TheObj.mysum(x,y);
            return res ;
      }
}

我在以下几个方面进行了汇编:

代码语言:javascript
复制
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中我这样做:

代码语言:javascript
复制
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函数运行得非常好。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-08-30 14:08:00

对于数组,这里有一个答案(设计感谢):为了将一个数组从c++传递给Excel-2011 (mac) VBA,c++函数的签名应该包含一个double *,它表示指向数组的第一个系数的指针,一个int (或long或其他)来表示数组的大小。例如,接受数组并将其所有系数乘以一个参数值的函数将被编码如下: c++代码是:

代码语言:javascript
复制
extern "C"
{
      void multarray(double * array, int size, double coeff)
      {
            for (int i = 0 ; i < size ; ++i)
            {
                  array[i]*=coeff;
            }
      }
}

编撰:

代码语言:javascript
复制
g++ -m32 -Wall -g -c ./tmp4.cpp
g++ -m32 -dynamiclib ./tmp4.o -o ./tmp4.dylib

现在,VBA应该引用dylib如下:

代码语言:javascript
复制
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的第一个参数表示数组的第一个系数,必须通过引用传递。下面是一个使用的例子:

代码语言:javascript
复制
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)上下文。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32237575

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档