Ниже показано, как мне удалось заставить MinGW создать DLL для использования в Excel 2003 VBA.
fooBar.cpp
int __stdcall Foo(int x)
{
return x * x;
}
double __stdcall Bar(double x)
{
return x * x;
}
1) Запустите оболочку MinGW и создайте каталог с именем fooBar
.
Закройте книгу Excel (если она открыта).
mkdir -p fooBar
cd fooBar
rm *.a *.dll *.def
2) Скомпилируйте и сгенерируйте файл .def - Примечание: эта DLL не будет работать, поскольку содержит искаженные символы.
gcc -shared -o fooBar.dll fooBar.cpp -Wl,--output-def,fooBar.def,--out-implib,libfooBardll.a
Сгенерированный файл fooBar.def будет выглядеть примерно так:
EXPORTS
_Z3Bard@8 @1
_Z3Fooi@4 @2
3) Измените сгенерированный файл fooBar.def, добавив чистые псевдонимы символов для сгенерированных символов. fooBar.def теперь должен выглядеть примерно так:
EXPORTS
_Z3Bard@8 @1
_Z3Fooi@4 @2
Bar = _Z3Bard@8
Foo = _Z3Fooi@4
4) Снова очистить (кроме измененного fooBar.def)
rm *.a *.dll
5) Скомпилировать файл .def с чистыми псевдонимами символов для сгенерированных символов.
gcc -shared -o fooBar.dll fooBar.cpp fooBar.def -Wl,--out-implib,libfooBar_dll.a
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
7) Если вы хотите вызвать функции из рабочей книги Excel, в ячейке введите =Foo(5)
или =Bar(5)