Вызов функций в DLL из C ++ - PullRequest
       34

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

39 голосов
/ 12 февраля 2009

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

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

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

Ответы [ 6 ]

20 голосов
/ 12 февраля 2009

Есть много способов сделать это, но я думаю, что один из самых простых вариантов - это связать приложение с 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: Определите функцию как экспорт в файле определения export.def .

EXPORTS    IsolatedFunction          @1

Шаг 4: Создайте проект DLL и добавьте к этому проекту файлы export.cpp и export.def . Построение этого проекта создаст export.dll и файл export.lib .

Следующие два шага ссылаются на DLL во время ссылки. Если вы не хотите определять точки входа во время соединения, игнорируйте следующие два шага и используйте LoadLibrary и GetProcAddress для загрузки точки входа функции во время выполнения.

Шаг 5: Создайте Test проект приложения для использования dll, добавив в проект файл export.lib . Скопируйте файл export.dll в то же место, где находится исполняемый файл консоли Test .

Шаг 6: Вызвать функцию IsolatedFunction из приложения Test, как показано ниже.

#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;
}
9 голосов
/ 12 февраля 2009

Может также экспортировать функции из dll и импортировать из exe, сначала это сложнее, но в конце гораздо проще, чем вызывать LoadLibrary / GetProcAddress. См. MSDN .

При создании проекта с помощью мастера VS в dll есть флажок, позволяющий экспортировать функции.

Затем в приложении exe нужно только #include заголовок из dll с правильными определениями и добавить проект dll в качестве зависимости от приложения exe.

Проверьте этот другой вопрос, если вы хотите продолжить изучение этого вопроса Экспорт функций из DLL с помощью dllexport .

6 голосов
/ 12 февраля 2009

Вы можете либо пойти по маршруту LoadLibrary / GetProcAddress (как Харпер упомянул в своем ответе, вот ссылку на динамическое связывание во время выполнения образца MSDN снова), либо вы можете связать консольное приложение с .lib создается из проекта DLL и включает файл hea.h с объявлением вашей функции (как описано в примере динамического связывания MSDN *1004* во время загрузки)

В обоих случаях вам нужно убедиться, что ваша DLL правильно экспортирует функцию, которую вы хотите вызвать. Самый простой способ сделать это - использовать __declspec (dllexport) в объявлении функции (как показано в примере создания простой библиотеки динамической компоновки MSDN ), хотя это можно сделать и через соответствующий файл .def. файл в вашем проекте DLL.

Для получения дополнительной информации по теме библиотек DLL вы должны просмотреть раздел MSDN о библиотеках Dynamic-Link .

5 голосов
/ 11 октября 2013

Ниже приведены 5 необходимых шагов:

  1. объявить указатель на функцию
  2. Загрузить библиотеку
  3. Получить адрес процедуры
  4. назначить его указателю на функцию
  5. вызов функции с помощью указателя функции

Вы можете найти пошаговый снимок экрана VC ++ 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;
}
0 голосов
/ 12 февраля 2009

Когда DLL создается, импортная библиотека обычно создается автоматически, и вы должны использовать эту ссылку, связанную с вашей программой, вместе с заголовочными файлами для ее вызова, но если нет, то вы можете вручную вызывать функции Windows, такие как LoadLibrary и GetProcAddress , чтобы заставить его работать.

0 голосов
/ 12 февраля 2009

Предполагая, что вы говорите о динамической загрузке DLL во время выполнения, вы ищете LoadLibrary и GetProAddress. Вот пример на MSDN .

...