Я думаю, что вы перепутали две вещи:
ключевое слово __declspec(dllexport)
MSVC экспортирует функции из DLL (говорит компоновщику сделать это), а __declspec(dllimport)
импортирует функции из DLL.Это делается во время загрузки, компоновщик создаст весь необходимый код для загрузки DLL и разрешит символ.Фактически, он добавляет некоторый код в exe, чтобы позволить ОС загружать DLL.Вы можете использовать функции, объявленные с __declspec(dllimport)
, как и любую обычную внутреннюю функцию.
Если вы хотите использовать этот подход, вам нужен файл библиотеки DLL, так как он содержит информацию для компоновщика, чтобы разрешить символическое имя.На самом деле он не содержит код, только эту информацию о DLL для компоновщика.Кроме того, вы должны сообщить компоновщику, что функция, которую вы хотите использовать, находится в DLL, используя магию __declspec (dllimport) перед объявлением функции.Вот почему вы предоставляете .lib и заголовочный файл (содержащий эти объявления) с вашей DLL, если вы хотите сделать это таким образом.Вам следует перестроить проект, который использует DLL, когда вы меняете DLL, так как файл .lib мог измениться.Вы можете использовать тот же файл заголовка в вашем проекте DLL и проектах, которые импортируются из этой библиотеки DLL:
#ifdef MYDLL_EXPORTS
#define MYDLL_API __declspec(dllexport)
#else
#define MYDLL_API __declspec(dllimport)
#endif
MYDLL_API void printMe(int);
MyDLL_API разрешается либо в __declspec (dllexport) (в проекте DLL, где вы определяете MYDLL_EXPORTSв настройках проекта) или __declspec (dllimport) (во всех проектах, использующих dll).Таким образом, вам нужен только один заголовочный файл для DLL.
Другим методом вызова функций DLL является использование LoadLibrary и GetProcAdress.Эти два используются для загрузки DLL во время выполнения.Основное различие между загрузкой DLL во время загрузки и во время выполнения состоит в том, что у вас есть некоторый контроль над загрузкой DLL во время выполнения, тогда как ОС будет выполнять эту работу, когда DLL должна загружаться во время загрузки (например, показывать окно сообщения, еслиDLL не может быть найдена и не запускает процесс).