Поделиться через


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

Обновлен: Ноябрь 2007

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

При указании ключевого слова __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 псевдоним можно объявить с помощью инструкции Declare.

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

См. также

Основные понятия

Библиотеки DLL