Вызов функций библиотек 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.