函数从一个DLL调用另一个dll的同名函数

时间:2011-12-02 17:07:08

标签: c++ visual-c++

我有一个特殊的问题。我有两个DLL,我们称之为DLL-A和DLL-B。

DLL-A有一个名为f1()的函数,DLL-B也有一个同名函数f1()。现在在DLL-A中,f1()像这样调用DLL-B的f1()

DLL-A

f1()
{
    f1(); //this is DLL-B function, but having the same name
}

现在我的问题是,它是来自DLL-A的f1()的递归调用吗?

5 个答案:

答案 0 :(得分:7)

函数体内的f1()调用自身,导致无限递归,如您所怀疑的那样。一些可能的解决方案:

  • 将导入的DLL函数放在单独的命名空间中,以便您可以区分其名称。
  • 更改这些功能的名称以避免冲突。
  • 使用GetProcAddress显式导入 而不是隐式。这允许您随意调用导入的函数。

答案 1 :(得分:6)

您可以将DLL-A中的函数名称更改为A_f1

A_f1()
{
  f1() //this calls DLL-B's f1
} 

在您的DEF文件中,写下

EXPORTS
    f1 = A_f1

这说“我内部调用的函数A_f1应该以{{1​​}}的名称导出到其他组件。”这样,所有使用DLL-A并调用f1(期望获得函数A)的人都将获得f1

我假设无法重命名导出的函数。如果可能,那么这是一个更清洁的解决方案。 (我的猜测是,这是不可能的,因为你正试图破解视频游戏。)

答案 2 :(得分:3)

他们写的方式 f1 in f1 不会调用DLL-B而是无限递归。如果要调用DLL-B函数,则必须使用 GetProcAddress

答案 3 :(得分:2)

如果链接两个导出相同符号的对象文件,则应该收到编译器或链接器错误。类似“符号f1()的多重定义”。

当然,如果你在一个dll中包含声明另一个函数的头文件或将两个二进制文件链接在一起。

要解决此问题,请将这些函数放在名称空间中。

答案 4 :(得分:2)

也许您可以通过以下方式更改名称:

#pragma comment(linker, "/export:MyFunc=_MyFunc@8")