Подтвердить что ты не робот

Вызов функций в DLL из С++

У меня есть решение в VS 2008 с двумя проектами в нем. Одна из них - это DLL, написанная на С++, а другая - простое консольное приложение на С++, созданное из пустого проекта. Я хотел бы знать, как вызвать функции в DLL из приложения.

Предположим, что я начинаю с чистого проекта на С++ и что я хочу вызвать функцию под названием int IsolatedFunction(int someParam)

Как мне это назвать?

4b9b3361

Ответ 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, чтобы заставить его работать.