declspec (dllimport) как загрузить библиотеку
http://msdn.microsoft.com/en-us/library/9h658af8.aspx
MSDN говорит, что я могу экспортировать функцию из библиотеки с __declspec(dllexport)
но как я могу загрузить эту библиотеку в мой исполняемый?
у меня есть экспортированная функция в DLL:
__declspec(dllexport) void myfunc(){}
и теперь я хотел бы использовать его в моем исполняемом файле:
__declspec(dllimport) void myfunc(void);
но как моя программа будет знать, где найти эту функцию?
3 ответов
это задание компилятора / компоновщика, оно выполняется автоматически до тех пор, пока вы
- включить .lib в параметрах компоновщика
- предоставьте DLL во время выполнения, чтобы он был найден exe
The .lib-файл создается при компиляции библиотеки DLL или поставляется вместе с ней, если это не ваш код. В этом случае код компилируется с __declspec(dllexport)
.
при компиляции exe компилятор видит, что включенная функция должна быть найдена в файл DLL. В этом случае код компилируется с __declspec(dllimpport)
.
компоновщик обеспечены .lib-файл и генерирует соответствующие инструкции в exe.
эти инструкции заставят Exe найти DLL и загрузить экспортированную функцию во время выполнения. DLL просто должна быть рядом с Exe (однако есть и другие возможные места).
переключение между __declspec(dllimpport)
и __declspec(dllexport)
выполняется макросом,предоставлено Visual C++ при создании DLL проект.
Если вы используете DLL, вы можете использовать LoadLibrary
и GetProcAddress
комбинации.
//Load the DLL
HMODULE lib = LoadLibrary("testing.dll");
//Create the function
typedef void (*FNPTR)();
FNPTR myfunc = (FNPTR)GetProcAddress(lib, "myfunc");
//EDIT: For additional safety, check to see if it loaded
if (!myfunc) {
//ERROR. Handle it.
}
//Call it!
myfunc();
ваша операционная система сможет найти его на основе переходного процесса. Если ваша библиотека правильно связана с вашей программой, она распознает, что используется внешняя функция, и ищет ее в путях dll. Если он не может найти его, ваш компоновщик выдаст ошибку.
Я рекомендую сделать некоторое чтение в процессе связывания; иногда это может быть запутанным, но понимание этого может помочь вам понять некоторые ключевые понятия в C / C++.