Вызов функций библиотек DLL из приложений Visual Basic

Для вызова функций на C или C++ из библиотеки DLL в приложениях на Visual Basic (или других языках, таких как Pascal или Fortran) эти функции необходимо экспортировать с использованием правильного соглашения о вызовах без какого-либо декорирования имен компилятором.

__stdcall создает правильное соглашение о вызове для функции (вызываемая функция очищает стек, а параметры передаются справа налево), но декорирует ее имя. Поэтому если для экспортированной функции в библиотеке DLL используется __declspec(dllexport), экспортируется декорированное имя.

Префикс __stdcall украшения имени символа с символом подчеркивания ( _ ) и добавляет символ с символом знака (@), за которым следует число байтов в списке аргументов (требуемое пространство стека). В результате функция, объявленная как:

int __stdcall func (int a, double b)

декорируется как _func@12 в выходных данных.

Соглашение о вызовах C (__cdecl) декорирует имя как _func.

Чтобы получить декорированное имя, используйте /MAP. Использование __declspec(dllexport) приводит к следующим результатам:

  • Если функция экспортируется с помощью соглашения О вызове C, она удаляет ведущий символ подчеркивания (__cdecl_ ) при экспорте имени.

  • Если экспортируемая функция не использует соглашение о вызовах C (например, __stdcall), экспортируется декорированное имя.

Так как переопределить место, где происходит очистка стека, невозможно, необходимо использовать __stdcall. Чтобы отменить декорирование имен при использовании __stdcall, необходимо указать их в виде псевдонимов в разделе EXPORTS файла DEF. Вот пример для следующего объявления функции:

int  __stdcall MyFunc (int a, double b);
void __stdcall InitCode (void);

В файле DEF:

EXPORTS
   MYFUNC=_MyFunc@12
   INITCODE=_InitCode@0

Для вызова библиотек DLL программам, написанными на Visual Basic, необходимо использовать прием с файлом DEF, описанный в этой статье. Если псевдоним задается в программе Visual Basic, использовать псевдонимы в файле DEF необязательно. Это можно сделать в программе Visual Basic, добавив предложение alias в оператор Declare.

Дополнительные сведения

См. также

Создание библиотек DLL на C и C++ в Visual Studio