C++ 来自一个dll的函数调用另一个dll的同名函数

C++ 来自一个dll的函数调用另一个dll的同名函数,c++,visual-c++,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()的递归调用吗 它们不会调用DLL-B,而是一个无限递归。如果要调用DLL-B函数,必须使用函

我有一个特殊的问题。我有两个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()
的递归调用吗

它们不会调用DLL-B,而是一个无限递归。如果要调用DLL-B函数,必须使用函数体中的
f1()
调用自身,从而导致无限递归,正如您所怀疑的那样。一些可能的解决办法:

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

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

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


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

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

A_f1()
{
  f1() //this calls DLL-B's f1
} 
在DEF文件中,写入

EXPORTS
    f1 = A_f1
这表示“我在内部调用的
A_f1
函数应该以
f1
的名称导出到其他组件。”这样,所有使用DLL-A并调用
f1
(期望得到函数A)的人都将得到
A_f1

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

我假设重命名导出的函数是不可能的。如果可能的话,这是一个更干净的解决方案。(我猜这是不可能的,因为你正在尝试破解一个视频游戏。)

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

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

关于黑客入侵视频游戏的好评论