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

function from one dll calling the same name function of another dll

本文关键字:DLL 函数 另一个 调用 一个      更新时间:2023-10-16

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

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

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

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

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

在DEF文件中写入

EXPORTS
    f1 = A_f1

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

我假设重命名导出的函数是不可能的。如果这是可能的,那么这是一个更干净的解决方案。(我猜这是不可能的,因为你正试图破解一款电子游戏。)

你写的方式f1在f1中不会调用DLL-B,而是一个无限递归。如果你想调用DLL-B函数,你必须使用GetProcAddress

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

当然,如果您在一个dll中包含声明另一个函数的头文件,或者将两个二进制文件链接在一起,则可以使用

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

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

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