CSTcmt9964 2017-11-30 04:55 采纳率: 0%
浏览 1114

EPS错误,通过调整Basic Runtime Checks设置解决的原理

最近再编写C#与C++双向交互的程序。

昨天解决了一个程序的bug,但是原理不清楚,望大神指点。

具体Bug:C#调用C++动态库的一个函数(如A),函数中做了很多C++与C#双向交互的工作,方法执行全部没有问题,其中双向调用的函数也都执行完毕,但是在A函数返回跳到C#后,跳下述错误:
Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call. This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention.
如果继续执行,会导致整个计算机系统崩溃。

解决办法:将C++ Code Generation中的Basic Runtime Checks 设为 Default。如此更改后,程序运行完全正常,后续代码运行正常,多次调用函数A也没有问题。

疑问:后续查了一下关于这个属性的定义,是不进行ESP检查。可是ESP是函数出入前后栈的检查,如果栈出错,按说程序无法回到原代码区,怎么会简单修改一个check属性后就可执行通过。另外为什么会出现check不通过的现象。

备注:非stdcall问题

  • 写回答

1条回答 默认 最新

  • threenewbee 2017-12-01 18:01
    关注

    是不是c++那里缓冲区溢出,破坏了堆栈上的返回地址,或者你C#定义的结构体封包、参数类型有问题。

    评论

报告相同问题?

悬赏问题

  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 有没有帮写代码做实验仿真的
  • ¥15 報錯:Person is not mapped,如何解決?
  • ¥30 vmware exsi重置后登不上
  • ¥15 易盾点选的cb参数怎么解啊
  • ¥15 MATLAB运行显示错误,如何解决?
  • ¥15 c++头文件不能识别CDialog
  • ¥15 Excel发现不可读取的内容
  • ¥15 关于#stm32#的问题:CANOpen的PDO同步传输问题