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 ответов


это задание компилятора / компоновщика, оно выполняется автоматически до тех пор, пока вы

  1. включить .lib в параметрах компоновщика
  2. предоставьте 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++.