__stdcall __cdecl 引起的程序崩溃
崩溃弹出的截图如下

看到0xC0000005, 访问冲突的问题, 九成九是内存访问违规, 比如访问了已经释放的指针, 又或者是离开函数时栈被破坏之类.
找了一下午一直没有头绪, 好在有一份可以执行的源代码, 于是就将那份可执行的源代码改啊改, 改成和我的代码差不多的样子, 终于发现了问题 (我想, 这也算是查找问题的一种方式吧, 呵呵)
问题就出在了我使用的函数是__cdecl方式调用, 而要求传入的回调函数是要__stdcall调用, 结果出回调函数的时候就弹出了上面的那种对话框. 把自己写的函数前面加一个__stdcall 问题就解决了.
温习一下__stdcall, __cdecl这两种调用方式的不同, 从而就可以分析出为什么会崩溃了.
windows要求你给的那个回调函数是__stdcall这种调用方式, 即, 由函数自己来清理函数栈;
而我传入的函数是__cdecl这种调用方式, 这种调用方式是要调用者来清理它调用的函数的栈, 从而就出现了问题: windows系统调用了我给的函数, 它以为我的这个函数在离开后已经把栈给清空了, 谁知道没有, 但同时我的这个函数已经执行结束了, 但是它的栈中数据没有清空, 就是指针没有指到栈底, 还指在函数栈的某一个地方, 于是, 程序继续往下执行时, 就出现了上面的那个对话框.
关于__stdcall, __cdecl两种调用方式的不同, 参考这篇文章:http://blog.csdn.net/dengziliang001/article/details/17448789
同时他还讲解了, 为什么存在两种方式? {因为有的函数不知道自己有多少参数, 所以要调用者来清理函数栈.} 他还有一个建议: 如果函数参数都固定的话, 应该使用__stdcall调用方式, 因为这种调用方式可以跨平台.
__stdcall __cdecl 引起的程序崩溃的更多相关文章
- __stdcall,__cdecl,__fastcall的区别
__stdcall,__cdecl,__fastcall的区别 标签: dll编译器pascalclassimportinitialization 2009-12-09 15:07 10472人阅读 ...
- 调用约定__stdcall / __cdecl
__cdecl与__stdcall这两种调用约定之间的主要差别在于由谁来执行对参数的清理工作. 如果是__cdecl,那么主调函数将负责执行清理工作,如果是__stdcall那被调函数将负责执行清理. ...
- iOS-----App闪退,程序崩溃---解决方案
1.iOS-中app启动闪退的原因 2.iOS开发-闪退问题-解决之前上架的 App 在 iOS 9 会闪退问题 3.iOS-应用闪退总结 4.iOS开发-捕获程序崩溃日志 5.iOS开发-应用崩溃日 ...
- iOS - 捕获应用程序崩溃日志
作为一名iOS移动应用开发者,为了确保你的应用程序正确无误,在将应用程序提交到应用商店之前,你必定会进行大量的测试工作:而且在你测试的过程中应用程序运行的很好,但是在应用商店上线之后,还是有用户抱怨应 ...
- iOS开发-捕获程序崩溃日志
iOS开发中遇到程序崩溃是很正常的事情,如何在程序崩溃时捕获到异常信息并通知开发者,是大多数软件都选择的方法.下面就介绍如何在iOS中实现: 1. 在程序启动时加上一个异常捕获监听,用来处理程序崩溃时 ...
- android 连接蓝牙扫码枪,程序崩溃之onConfigurationChanged
当android手机通过蓝牙连接扫码枪时,程序崩溃的原因之一是:键盘弹出或隐藏,触发程序走了onDestory->onCreate的生命周期,从而可能使得页面的某些初始化数据被清除了. 解决方法 ...
- Android 程序崩溃后的处理
在应用发布以后,由于安卓机型的千差万别 ,可能会出现各种各样的问题,这时候如果我们可以将这些信息收集起来,并进行修改就很不错了.下面就来讨论一下怎么处理程序崩溃以后,错误信息的手机. Java中已经提 ...
- iOS 中捕获程序崩溃日志
iOS 中捕获程序崩溃日志 (2014-04-22 17:35:59) 转载▼ iOS开发中遇到程序崩溃是很正常的事情,如何在程序崩溃时捕获到异常信息并通知开发者,是大多数软件都选择的方法.下 ...
- 让linux中的程序崩溃时生成core文件
当我们的linux程序崩溃的时候,常常会有这样的提示: Segmentation fault (core dumped) 段错误 (核心已转储) 提示说生成了core文件,但是此功能 ...
随机推荐
- WampServer 常见问题
Wamp就是Windows 下的Apache Mysql PHP集成环境. 支持phpmyadmin 注意:安装前请先安装VC 2010运行库(vcredist2010.exe ),否则会提示没有找到 ...
- curl_multi_select解决curl_multi网页假死问题
curl_multi可以批处理事务,给网页编程带来很大的方便.不过在使用curl_multi的过程中,我们会遇到一个比较头疼的问题,那就是当并发处理的事务数量过多的时候,就会出现CPU过高,网页假死的 ...
- oracleinsert的时候返回插入的ID
//---------------- 声明部分 ---------------- create or replace package Pro_Test_User is PROCEDURE Ins_Te ...
- Check which .NET Framework version is installed
his article will help you to know which .NET Framework version is installed from command line. Check ...
- HBase启动后发现HMaster进程消失了
HMaster没起来很多原因,这次看日志是这个.详细请看:http://www.bkjia.com/yjs/982064.html Hbase:namespace异常处理,hbase异常处理 Hbas ...
- Google ProtocolBuffers2.4.1应用说明(一)
1.概念 Protocol buffers是一个用来序列化结构化数据的技术,支持多种语言诸如C++.Java以及Python语言,可以使用该技术来持久化数据或者序列化成网络传输的数据.相比较一些其他的 ...
- confluence + 禅道安装教程
都是从网上拿的 1. 搭建confluence BE82-LO81-4O25-THDD AAABMQ0ODAoPeJxtkE1rwzAMhu/+FYadXepkYd3AsDQ2rCwfZUkHO7qp ...
- SAP 物料移动类型查询表
Goods movement w/o referenceB Goods movement for purchase orderF Goods movement for production order ...
- 2014年第五届蓝桥杯C/C++B组省赛题目解析
一.啤酒和饮料 啤酒每罐2.3元,饮料每罐1.9元.小明买了若干啤酒和饮料,一共花了82.3元. 我们还知道他买的啤酒比饮料的数量少,请你计算他买了几罐啤酒. 注意:答案是一个整数.请通过浏览器提交答 ...
- Java数组排序和搜索
如何排序数组并搜索其中的元素? 以下示例显示如何使用sort()和binarySearch()方法来完成任务.用户定义的方法printArray()用于显示数组输出: package com.yiib ...