gpt4 book ai didi

c++ - 是否有可能在 __stdcall 中有一个导出函数并且名称未被破坏?

转载 作者:太空狗 更新时间:2023-10-29 20:40:24 24 4
gpt4 key购买 nike

我正在从事一个项目,为离线测试生成一个虚拟 DLL。我们有真正的 DLL 及其头文件,尽管它们看起来不兼容。 DLL 中的名称未被破坏,但函数前向声明声明被调用为 __stdcall:

例子.h

DWORD __stdcall DoSomething(byte aByte);

Dependency Walker 中的 example.dll:

2 (0x0002)   2 (0x0002)   DoSomething   0x000831C0

据我所知,如果可以在 __stdcall 约定中导出一个函数,它的名称在 dependency walker 中应该读作:

2 (0x0002)   2 (0x0002)   _DoSomething@1   0x000831C0

这是否意味着我们的头文件与编译后的 DLL 不对应,或者我是否遗漏了什么?

最终,我如何形成虚拟函数的导出,使其行为方式与我正在模拟的真实 DLL 相同?

最佳答案

只有两种方法可以获得__stdcall名称修饰:

  • 您必须使用 .def 文件重命名导出。不使用它就能取得成功。

  • 您构建的代码是针对 x64 的。由于它很幸运地只有一个调用约定,因此编译器将忽略您的 __stdcall 属性并且不会修饰名称。现在您需要一个 .def 文件来重命名导出。永远不要这样做,没有人会期望在 64 位代码中使用装饰。

请注意,如果经过修饰,导出的名称将为 _DoSomething@4。名称的 @ 部分表示堆栈激活帧的大小。换句话说,在函数返回之前需要从堆栈中弹出的字节数。对于 32 位代码,它永远不能为 1,它始终是 4 的倍数。存在此名称修饰是因为 __stdcall 非常危险,弹出堆栈的函数比预期多或少会导致很难诊断堆栈不平衡。链接器捕获函数原型(prototype)声明错误。

关于c++ - 是否有可能在 __stdcall 中有一个导出函数并且名称未被破坏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24405168/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com