gpt4 book ai didi

c++ - 通过vba for mac在Excel中加载dylib

转载 作者:太空狗 更新时间:2023-10-29 23:20:32 27 4
gpt4 key购买 nike

我正在尝试使用 Mac 将 C++ DLL 公开给 Excel。 DLL 是使用 Xcode 4 编写和编译的,我使用的是 Excel 2011。

对于简单的函数,extern "C"可以完成工作,我可以在 Excel 中使用 dylib。具体来说,如果 C++ 代码类似于

extern "C"
{
double sumC( double a, double b)
{
return a + b;
}
}

VBA代码是:

Private Declare Function addFunction _
Lib "Macintosh HD:Users:SVM:Documents:Excel:lib:libTestDLLtoVBA.dylib" _
Alias "sumC" (ByVal a As Double, ByVal b As Double) As Double

Function Addition(a As Double, b As Double)
Addition = addFunction(a, b)
End Function

一切正常。但是,我有兴趣使用头文件中定义的类向 Excel 公开更复杂的代码——如下例所示——在这种情况下,Excel 会返回#VALUE!。我的 C++ 代码是这样的

头文件:

#ifndef TestDLLtoVBA_TestFunction_h
#define TestDLLtoVBA_TestFunction_h

class AdditionVBATest{

public:
AdditionVBATest(){};
AdditionVBATest( double ){ m_AdditionResult = 0.0; }
~AdditionVBATest(){};

void setResult( double nAddition ){ m_AdditionResult = nAddition; }
double getResult(){ return m_AdditionResult; }

void addFunct( double x, double y, double &nResult );
double addFunct( double, double );

private:
double m_AdditionResult;
};

double addFunctionC( double a, double b);

#endif

cpp文件:

#include <iostream>
#include "TestFunction.h"

void AdditionVBATest::addFunct(double x, double y, double &nResult)
{
nResult = 0.0;
nResult = x + y;
AdditionVBATest::setResult(nResult);
}

double AdditionVBATest::addFunct( double a, double b )
{
double nResult(0.0);
AdditionVBATest addCompute;
addCompute.AdditionVBATest::addFunct(a, b, nResult);

AdditionVBATest addResult;
return addResult.getResult();
}

最后,这是包含我想向 Excel 公开的函数的文件:

#include <iostream>
#include "TestFunction.h"

extern "C"
{
double addFunctionC( double a, double b)
{
AdditionVBATest *resAddition;
double result(0.0);

result = resAddition->AdditionVBATest::addFunct(a, b);
return result;
}
}

我尝试在 C++ 应用程序中使用相同的 dylib 并且工作正常,所以我相信这与通过 VBA 公开库有关。

我用的VBA代码是

Private Declare Function addFunction _
Lib "Macintosh HD:Users:SVM:Documents:Excel:lib:libTestDLLtoVBA.dylib" Alias "addFunctionC" _
(ByVal a As Double, ByVal b As Double) As Double

Function Addition(a As Double, b As Double)
Addition = addFunction(a, b)
End Function

如有任何帮助,我们将不胜感激。

最佳答案

这当然不是必需的,但为了简化起见,我假设从现在开始你的头文件和两个源文件都在同一个目录中,并且所有以后的命令都在这个目录中执行。然后在两个源文件中替换

#include "TestFunction.h"

#include "./TestFunction.h"

然后,编译如下:

g++ -m32 -Wall -g -c ./TestFunction.cpp -o ./TestFunction.o
g++ -m32 -dynamiclib ./file.cpp ./TestFunction.o -o ./libTestDLLtoVBA.dylib

在哪里

  • g++ 是您的 gcc。我猜是 clang 的,在我的电脑上是 gcc 5.2.0,但两者都应该可以正常工作
  • file.cpp 是包含 addFunctionC 声明的源文件
  • -m32 选项要求生成 32 位 dylib,因为 mac 上的 excel/VBA 是 32 位

现在执行 nm -gU libTestDLLtoVBA.dylib,您将看到带有 _addFunctionC 的行,表明函数 addFunctionC 确实已导出。

在VBA中,声明如下:

Declare Function addFunctionC Lib "/Path/to/your/libTestDLLtoVBA.dylib" (ByVal x As Double, ByVal y As Double) As Double

Function Addition(a As Double, b As Double)
Addition = addFunction(a, b)
End Function

它应该可以工作。 This是一个很好的灵感来源。

现在,如果您不想使用命令行并想使用 XCode,我会说您唯一需要注意的是确保 XCode 生成 32 位 dylib,如 excel/VBA 仅在 mac OS X 上是 32 位的。我真的认为这个 32 位的东西是你的问题。

关于c++ - 通过vba for mac在Excel中加载dylib,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28130042/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com