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