Файлы
__declspec(dllexport)
и .def - это два разных способа экспорта символов из DLL.Вам не нужны оба, и вы должны опустить одно из них.Метод __declspec
гораздо более универсален для программ на c ++, так как он экспортирует имена с помощью манипуляции с ++, что позволяет экспортировать перегруженные функции, но, наоборот, затрудняет импорт имен через GetProcAddress.универсальный макрос типа EXPORT_DLL
опасен, так как это означает, что вы не можете создать dll, которая использует другую dll, без одной dll, пытающейся экспортировать все символы обеих dll.
DevStudio автоматически создаетсимвол в проектах dll: <PROJECT>_EXPORTS
, облегчающий и безопасный способ создания макроса EXPORT:
#ifdef EXPORT
#undef EXPORT
#endif
#ifdef PROJECTNAMEHERE_EXPORTS
#define EXPORT __declspec(dllexport)
#else
#define EXPORT __declspec(dllimport)
#endif
EXTERN_C EXPORT void __stdcall Function1(void);
EXTERN_C EXPORT void __cdecl Function2(...);
EXPORT void Function3(void);
Функции 1 и 2 можно получить с помощью GetProcAddress как _Function1@0
и Function2
соответственно.Функция 3 будет экспортирована через искаженное имя для компилятора, которое будет выглядеть примерно так: @Function3@@UAG_DB@Z
.Это имя отличается для каждой перегрузки функции, что позволяет перегрузке работать.
Важно знать искажение имени __declspec
, поскольку файлы .def не заботятся и просто экспортируют Function1
, Function2
и Function3
.