我有一个特殊的问题。我有两个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()
的递归调用吗?
答案 0 :(得分:7)
函数体内的f1()
调用自身,导致无限递归,如您所怀疑的那样。一些可能的解决方案:
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")