以下是我如何让MinGW构建一个在Excel 2003 VBA中使用的DLL.
fooBar.cpp
int __stdcall Foo(int x)
{
return x * x;
}
double __stdcall Bar(double x)
{
return x * x;
}
Run Code Online (Sandbox Code Playgroud)
1)启动MinGW shell并创建一个名为的目录fooBar.关闭Excel工作簿(如果已打开).
mkdir -p fooBar
cd fooBar
rm *.a *.dll *.def
Run Code Online (Sandbox Code Playgroud)
2)编译并生成.def文件 - 注意:此dll不起作用,因为它有错位符号.
gcc -shared -o fooBar.dll fooBar.cpp -Wl,--output-def,fooBar.def,--out-implib,libfooBardll.a
Run Code Online (Sandbox Code Playgroud)
生成的fooBar.def类似于:
EXPORTS
_Z3Bard@8 @1
_Z3Fooi@4 @2
Run Code Online (Sandbox Code Playgroud)
3)通过为生成的符号添加干净的符号别名来修改生成的fooBar.def文件.fooBar.def现在应该看起来像:
EXPORTS
_Z3Bard@8 @1
_Z3Fooi@4 @2
Bar = _Z3Bard@8
Foo = _Z3Fooi@4
Run Code Online (Sandbox Code Playgroud)
4)再次清除(修改后的fooBar.def除外)
rm *.a *.dll
Run Code Online (Sandbox Code Playgroud)
5)使用带有生成符号的干净符号别名的.def文件进行编译.
gcc -shared -o fooBar.dll fooBar.cpp fooBar.def -Wl,--out-implib,libfooBar_dll.a
Run Code Online (Sandbox Code Playgroud)
6)打开Excel并添加以下VBA代码(确保使用正确的路径,怀疑它将包含mmorris):
Private Declare Function Foo Lib _
"C:\MinGW\msys\1.0\home\mmorris\fooBar\fooBar.dll" _
(ByVal x As Long) As Long
Private Declare Function Bar Lib _
"C:\MinGW\msys\1.0\home\mmorris\fooBar\fooBar.dll" _
(ByVal x As Double) As Double
Run Code Online (Sandbox Code Playgroud)
7)如果要从单元格类型=Foo(5)或单元格中调用Excel工作簿中的函数=Bar(5)