Как создать DLL, используя компилятор gcc / Mingw для Visual Basic? - PullRequest
3 голосов
/ 27 апреля 2010

Как создать dll с помощью компилятора gcc / Mingw для Visual Basic?

Ответы [ 4 ]

8 голосов
/ 16 ноября 2011

Ниже показано, как мне удалось заставить 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)

2 голосов
/ 13 марта 2012

Сначала несколько 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. Его решение, вероятно, работает, хотя.

1 голос
/ 04 июля 2010

Это: http://www.mingw.org/wiki/DLL может быть полезно для вас.

0 голосов
/ 15 июня 2010

VB (все версии) предпочитает соглашение о вызовах паскаля.

Объявите внешние функции с помощью WINAPI и экспортируйте их в файл .def.

...