Вызов функций в DLL из С++
У меня есть решение в VS 2008 с двумя проектами в нем. Одна из них - это DLL, написанная на С++, а другая - простое консольное приложение на С++, созданное из пустого проекта. Я хотел бы знать, как вызвать функции в DLL из приложения.
Предположим, что я начинаю с чистого проекта на С++ и что я хочу вызвать функцию под названием int IsolatedFunction(int someParam)
Как мне это назвать?
Ответы
Ответ 1
Есть много способов сделать это, но я думаю, что один из самых простых вариантов - связать приложение с DLL во время ссылки, а затем использовать файл определения для определения символов, которые будут экспортированы из DLL.
CAVEAT: Подход к файлам определений подходит для неидентифицированных имен символов. Если вы хотите экспортировать декорированные символы, то, вероятно, лучше НЕ ИСПОЛЬЗОВАТЬ подход к файлу определения.
Вот простой пример того, как это делается.
Шаг 1: Определите функцию в файле export.h.
int WINAPI IsolatedFunction(const char *title, const char *test);
Шаг 2: Определите функцию в файле export.cpp.
#include <windows.h>
int WINAPI IsolatedFunction(const char *title, const char *test)
{
MessageBox(0, title, test, MB_OK);
return 1;
}
Шаг 3: Определите функцию как экспорт в файле def.conf export.def.
EXPORTS IsolatedFunction @1
Шаг 4: Создайте проект DLL и добавьте в этот проект файлы export.cpp и export.def. Построение этого проекта создаст файл export.dll и файл export.lib.
Следующие два шага ссылаются на DLL во время соединения. Если вы не хотите определять точки входа во время соединения, проигнорируйте следующие два шага и используйте LoadLibrary и GetProcAddress, чтобы загрузить точку входа функции во время выполнения.
Шаг 5: Создайте проект приложения тестирования, чтобы использовать DLL, добавив в проект файл export.lib. Скопируйте файл export.dll в то же место, что и исполняемый файл тестовой консоли.
Шаг 6: Вызовите функцию IsolFunction из тестового приложения, как показано ниже.
#include "stdafx.h"
// get the function prototype of the imported function
#include "../export/export.h"
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
// call the imported function found in the dll
int result = IsolatedFunction("hello", "world");
return 0;
}
Ответ 2
Можно также экспортировать функции из dll и импортировать из exe, сначала это сложнее, но в конце намного проще, чем вызов LoadLibrary/GetProcAddress. См. MSDN.
При создании проекта с помощью мастера VS есть флажок в dll, который позволяет экспортировать функции.
Затем в приложении exe вам нужно только # включить заголовок из dll с соответствующими определениями и добавить проект dll в зависимость от приложения exe.
Проверьте этот другой вопрос, если вы хотите продолжить изучение этого пункта Экспорт функций из DLL с помощью dllexport.
Ответ 3
Вы можете либо пройти маршрут LoadLibrary/GetProcAddress (как упоминал Харпер в своем ответе, здесь ссылка на динамическую компоновку MSDN-образца во время выполнения снова), или вы можете связать консольное приложение с .lib, созданным из проекта DLL, и включить файл hea.h с объявлением вашей функции (как описано в динамическая компоновка MSD для загрузки)
В обоих случаях вам нужно убедиться, что ваша DLL экспортирует функцию, которую вы хотите правильно назвать. Самый простой способ сделать это - использовать __declspec (dllexport) в объявлении функции (как показано при создании MSDN О библиотеках динамических ссылок.
Ответ 4
Ниже приведены 5 шагов:
- объявить указатель на функцию
- Загрузите библиотеку
- Получить адрес процедуры
- назначьте его указателю на функцию
- вызов функции с помощью указателя функции
Вы можете найти шаг за шагом экран VС++ IDE, снятый в http://www.softwareandfinance.com/Visual_CPP/DLLDynamicBinding.html
Вот фрагмент кода:
int main()
{
/***
__declspec(dllimport) bool GetWelcomeMessage(char *buf, int len); // used for static binding
***/
typedef bool (*GW)(char *buf, int len);
HMODULE hModule = LoadLibrary(TEXT("TestServer.DLL"));
GW GetWelcomeMessage = (GW) GetProcAddress(hModule, "GetWelcomeMessage");
char buf[128];
if(GetWelcomeMessage(buf, 128) == true)
std::cout << buf;
return 0;
}
Ответ 5
Предполагая, что вы говорите о динамической загрузке библиотек DLL, вы ищете LoadLibrary и GetProAddress. Вот пример на MSDN.
Ответ 6
Когда DLL была создана, библиотека импорта обычно создается автоматически, и вы должны использовать ее в своей программе вместе с заголовочными файлами для ее вызова, но если нет, то вы можете вручную вызывать функции Windows, такие как LoadLibrary и GetProcAddress, чтобы заставить его работать.