如何从DLL调用外部函数?

时间:2019-07-09 06:13:04

标签: c++ dll

我正在创建一个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 个答案:

答案 0 :(得分:1)

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都包含标头。确保在Windows上编译时在dll版本中定义“ BUILDING_MY_LIB”。编译dll时,您还应该获得一个链接库(例如,在Windows上将拥有mydll.dll和mydll.lib)。

您的exe现在只需要包含dll.h,并链接到mydll.lib(或linux上的mydll.so)。如果您的应用程序可以找到该dll,它将自动加载。

如果您想更进一步,将dll动态地加载到exe中,则可能需要将函数原型更改为:

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

这将禁用名称修饰。您应该能够在Windows上使用LoadLibrary或在Linux上使用dlopen打开DLL。例如

// 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);