2013-07-29 4 views
8

http://msdn.microsoft.com/en-us/library/9h658af8.aspx__declspec (DllImport), как загрузить библиотеку

MSDN говорит, что я могу экспортировать функцию из библиотеки с __declspec(dllexport), но как я могу загрузить эту библиотеку в моем исполняемом?

У меня экспортированной функции в DLL:

__declspec(dllexport) void myfunc(){} 

А теперь я хотел бы использовать его в моем исполняемым:

__declspec(dllimport) void myfunc(void); 

Но как моя программа будет знать, где найти это функционировать?

+4

Посмотрите: http://stackoverflow.com/questions/538134/exporting-functions-from-a-dll-with-dllexport –

+3

Это не к вашей программе. Именно операционная система может найти нужную DLL. Вы можете очень тяжело это сделать, но просто нечего делать. Убедитесь, что DLL присутствует в том же каталоге, что и ваш EXE, и он будет работать плавно. –

ответ

7

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

  1. включают .lib в опции компоновщика
  2. предоставить DLL во время выполнения так, что он находится в ехе

Файл .lib создается при компиляции библиотеки DLL или поставляется вместе с ней, если это не ваш код. В этом случае код скомпилирован с __declspec(dllexport).

При компиляции вашего exe компилятор видит, что включенная функция находится в DLL. В этом случае код скомпилирован с __declspec(dllimpport).

Компилятор снабжен файлом .lib и генерирует соответствующие инструкции в exe.

Эти инструкции заставят Exe найти DLL и загрузить экспортированную функцию во время выполнения. DLL просто должна быть рядом с Exe (есть и другие возможные места, однако).

Переключение между __declspec(dllimpport) и __declspec(dllexport) осуществляется путем макроса, provided by Visual C++ when creating a DLL project.

+0

Как я могу предоставить DLL во время выполнения? – deepspace

+0

@deepspace см. Мое редактирование, он просто должен быть рядом с Exe – CharlesB

1

Ваша операционная система сможет найти ее на основе процесса связывания. Если ваша библиотека правильно связана с вашей программой, она распознает, что используется внешняя функция, и найдите ее в путях dll. Если он не может найти его, ваш компоновщик выдает ошибку.

Я рекомендую сделать некоторые чтения в процессе связывания; это может быть запутанным время от времени, но понимание этого может помочь вам понять некоторые ключевые понятия в C/C++.

1

Если вы используете 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(); 
+0

- это что-то вроде __declspec (dllimpport)? – pasha

Смежные вопросы