一个DLL中的函数调用另一个DLL中同名的函数。

6

我有一个奇怪的问题。我有两个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
}

现在我的问题是,f1() 会从 DLL-A 中进行递归调用吗?
5个回答

7

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

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

7
您可以将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
我假设重命名导出函数是不可能的。如果可以重命名,那么这将是一个更为清晰的解决方案。(我的猜测是你正在试图破解一个视频游戏。)

关于黑客攻击视频游戏的好评论。 - Gabrielius

3
您写的 f1 within f1 的方式将不会调用 DLL-B,而是导致无限递归。如果您想调用 DLL-B 函数,您需要使用 GetProcAddress

2
如果您链接两个导出相同符号的对象文件,应该会得到编译器或链接器错误。类似于“符号f1()的多重定义”。
当然,这是在一个dll中包含声明另一个函数的头文件或将两个二进制文件链接在一起时。
为了解决这个问题,请将函数放在命名空间中。

2
也许你可以通过以下方式更改名称:
#pragma comment(linker, "/export:MyFunc=_MyFunc@8")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接