Как создать dll с помощью компилятора gcc/Mingw для Visual Basic?
Как создать dll с помощью компилятора gcc/Mingw для Visual Basic?
Ответы (4)
Ниже показано, как мне удалось заставить 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)
Сначала немного DLL-этикета:
Все экспортируемые функции должны иметь связь с C. Все исключения C++, созданные внутри DLL, должны перехватываться внутри dll.
Почему? Потому что в Windows нет стандартного C++ ABI.
Также используйте __declspec(dllexport) для функций, которые необходимо экспортировать.
Теперь, как сделать DLL без необходимости в каком-либо файле DEF.
fooBar.cpp
#ifdef __cplusplus
extern "C"
{
#endif
__declspec(dllexport) int __stdcall square_int(int x) //I prefer manual mangling in this case to support static polymorphism
{
return x * x;
}
__declspec(dllexport) double __stdcall square_double(double x)
{
return x * x;
}
#ifdef __cplusplus
}
#endif
скомпилировать с использованием
gcc fooBar.cpp -shared -Wl,--kill-at -o fooBar.dll
Теперь вы сможете вызывать Square_xxx, как в ответе mmorris. Его решение, вероятно, работает.
VB (все версии) предпочитает соглашение о вызовах Pascal.
Объявите свои внешние функции с помощью WINAPI и экспортируйте их в файл .def.