(Dependency Walker)在函数上缺少显式类型

时间:2013-09-29 02:12:16

标签: c++ dependency-walker

提前为noob错误道歉。这是我的第一个问题。首先,一些背景知识:

我正在尝试使用依赖性walker为程序创建一个模块,以便在.dll中找到我没有lib或任何源代码的C ++函数。您还可以假设我无法获得原始开发人员的支持。基本上,我检查了另一个访问它的文件,看看它的最小功能是什么。以下是输出的未修饰名称的示例:

void foo::bar::baz(float)
float foo::bar::qux(void)
foo::bar::bar(void)
class foo::bar & foo::bar::operator=(class foo::bar const &)

前两个函数显然采用float或void并返回float或void。我有一个类似的功能,使用类似的东西:

HINSTANCE THEDLL = LoadLibrary("C:\\dllFolder\\theDll.dll");
typedef float (*quxType)(void);
quxType qux = (quxType)GetProcAddress(THEDLL, "quxMangledName");

所以那些不是问题。

现在,列表中的第三个看起来像另一个取消void的函数,但它没有明确的返回类型。这是否意味着我应该只为它使用隐式类型,它是无效的,还是它不是真正的函数?如果没有,那是什么?

我不知道如何处理第四个问题。甚至可以在没有相关的.h文件的情况下进行处理吗?

我环顾四周,但是当函数看起来不像具有显式返回类型的普通函数时,我找不到任何关于该怎么做的信息。尽管我使用的代码基本上与我用来运行类似.dll的函数相同,但是当我尝试在这里使用函数#2时,我仍然遇到访问冲突崩溃(我真的只需要函数#2)。所以我猜测.dll需要更多的信息或需要首先初始化的东西,这就是为什么我对列表中的其他人感兴趣。

我意识到这是一个复杂的问题,因此可能不会有一个“正确答案”解决方案让它运作,但如果我犯了任何明显的错误,或者如果有任何一般性建议如何攻击问题(甚至是依赖步行者的替代方案),请告诉我。

1 个答案:

答案 0 :(得分:0)

第3个是bar的默认构造函数。 第四个是bar的复制赋值运算符。

我认为您需要首先实例化该类,以便调用第二个方法。否则,将使用导致访问冲突的无效“this”调用该方法。

问题是你如何实例化它? 如果您可以找到返回DLL中的栏的工厂函数,则可以尝试使用它。

如果您没有看到工厂函数并且没有lib文件,可以在此处参考如何从DLL创建lib的答案:How to make a .lib file when have a .dll file and a header file

您还需要为该类创建头文件,并使用正确的成员顺序和类型。这样您就不必使用LoadLibrary和GetProcAddress,只需正常使用该类。

你可能仍然使用LoadLibrary和GetProcAddress而不使用lib和header,这篇博客展示了如何手动分配内存,调用构造函数,获取对象并传递该对象来调用方法:http://recxltd.blogspot.com/2012/02/working-with-c-dll-exports-without.html