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#定义的结构体封包、参数类型有问题。

    评论

报告相同问题?

悬赏问题

  • ¥20 delta降尺度方法,未来数据怎么降尺度
  • ¥15 c# 使用NPOI快速将datatable数据导入excel中指定sheet,要求快速高效
  • ¥15 再不同版本的系统上,TCP传输速度不一致
  • ¥15 高德地图点聚合中Marker的位置无法实时更新
  • ¥15 DIFY API Endpoint 问题。
  • ¥20 sub地址DHCP问题
  • ¥15 delta降尺度计算的一些细节,有偿
  • ¥15 Arduino红外遥控代码有问题
  • ¥15 数值计算离散正交多项式
  • ¥30 数值计算均差系数编程