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

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


person Rina    schedule 27.04.2010    source источник
comment
Какая версия Visual Basic? Какую технологию вы хотите использовать в VB для вызова dll: вызовы COM или API/PInvoke?   -  person Alex F    schedule 27.04.2010


Ответы (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)

person mmorris    schedule 16.11.2011

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

person user877329    schedule 13.03.2012
comment
Это скомпилировано, но не работает в Excel. Совет mmorris работает, но это выглядит как лучшая реализация. Возможно, проблема с версией mingw gcc? Этот метод - то, над чем я должен поразмыслить, потому что он кажется более элегантным решением. Спасибо. - person RJB; 28.03.2013
comment
@RJB Я не пробовал сам, но, возможно, Excel не распознает '_' - person user877329; 31.03.2013

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

person rogerdpack    schedule 04.07.2010

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

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

person Joshua    schedule 15.06.2010