如何使用gcc编译器/ Mingw为visual basic创建dll?

Rin*_*ina 3 dll gcc mingw

如何使用gcc编译器/ Mingw为visual basic创建dll?

mmo*_*ris 8

以下是我如何让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)