Как вызвать внешнюю функцию из DLL? - PullRequest
0 голосов
/ 09 июля 2019

Я создаю DLL.

моя DLL вызывает функцию passDTMFToClient(int id,DTMF_01 packet), где DTMF_01 - это структура;

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

Я не хочу перемещать эту функцию в мою DLL.Таким образом, как я могу вызвать его из dll?

Например,

  • DLL:
void DTMF()
{
    passDTMFToclient(int id,DTMF_01 packet);        
}

Файл другого проекта Гдеопределение доступно и где будет указана dll.

  • Demo.cpp:
void passDTMFToClient(int id,DTMF_01 packet)
{
    .
    .
}

1 Ответ

1 голос
/ 09 июля 2019

DLL.h

#pragma once

#ifdef _WIN32
# ifdef BUILDING_MY_LIB
#  define MY_EXPORT __declspec(dllexport)
# else
#  define MY_EXPORT __declspec(dllimport)
# endif
#else
# define MY_EXPORT __attribute__ ((visibility ("default")))
#endif

// declare as dll method
MY_EXPORT void passDTMFToClient(int id, DTMF_01 packet);

Убедитесь, что заголовок включен как вами dll.cpp, так и exe.cpp.Убедитесь, что в вашей dll-сборке вы определяете 'BUILDING_MY_LIB' при компиляции в Windows.При компиляции dll вы также должны получить библиотеку ссылок (например, у вас есть mydll.dll и mydll.lib на окнах).

Теперь вашему exe-файлу просто нужно включить dll.h и ссылку наmydll.lib (или mydll.so в Linux).Если ваше приложение может найти DLL, оно будет автоматически загружено.

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

MY_EXPORT extern "C" void passDTMFToClient(int id, DTMF_01 packet);

, который отключит имяковеркание.Вы должны быть в состоянии открыть DLL, используя LoadLibrary для Windows или dlopen в Linux.например,

// on windows
HMODULE dllHandle = LoadLibrary("mydll.dll");

// on linux
void* dllHandle = dlopen("mydll.dll", RTLD_NOW);

Вам понадобится указатель на функцию, например,

// typedef func type
typedef void (*passDTMFToClient_func)(int, DTMF_01);

// the function pointer
passDTMFToClient_func passDTMFToClient = 0;

Затем вам просто нужно получить адрес символа, который вы так делаете в Windows:

passDTMFToClient = (passDTMFToClient_func)GetProcAddress(dllHandle, "passDTMFToClient");

И так же в Linux:

passDTMFToClient = (passDTMFToClient_func)dlsym(dllHandle, "passDTMFToClient");

И когда вы закончите работу с DLL, вы можете снова закрыть ее:

// windows
FreeModule(dllHandle);
// linux
dlclose(dllHandle);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...