Windows编程中的错误处理
2010年07月09日
Windows编程中获得错误信息
在windows编程中我们的函数往往不如我们想象的那样工作,他经常会出现很多这样那样的问题,一般情况下,我们可以通过他们的返回值来得到他们到底是否发了小脾气: Windows常见的返回值类 型:1) VOID:表明该函数运行不可能失败,Windows函 数的返回值很少是VOID。2) BOOL:如果函数运行失败,返回值是0,否则 返回值是非0值。最好对返回值进行测试,以确定它是0还 是非0,而不是测试返回值是否是TRUE。3) HANDLE:如果函数运行失败,则返回值通常是NULL, 否则返回值是某个HANDLE,用于标识你可以操作的一个对象。请注意这些值,有些函数失败时会返回一个句柄值INVALID_HANDLE_VALUE, 它被定义为-1。函数的Platform SDK文 档将会清楚地说明函数运行失败时返回值是NULL还是INVALID_HANDLE_VALUE。4) PVOID:如果函数运行失败,返回值是NULL, 否则返回PVOID,以标识数据块的内存地址。5) LONG/DWORD:这是个难以处理的值。返回数量的函数通常返回LONG或DWORD,如果由于某种原因,函数无法对想要进行计数的对象进行计数,那么该函数通常返回0或-1(根据函数而定)。如果调用的函数返回值为LONG或DWORD,那么得阅读Platform SDK以确保能正确检测潜在的错误。
由此可见,得到错误信息对我们修改程序帮助很大,如何获取这些错误信息呢。其实非常简单,windows为我们提供了3个API函数,我们可以使用他们来获取错误信息。 DWORD WINAPI GetLastError(void); void WINAPI SetLastError( __in DWORD dwErrCode); void WINAPI SetLastErrorEx(__in DWORD dwErrCode, DWORD dwType); DWORD WINAPI FormatMessage( __in DWORD dwFlags, __in LPCVOID lpSource, __in DWORD dwMessageId, __in DWORD dwLanguageId, __out LPTSTR lpBuffer, __in DWORD nSize, __in va_list* Arguments); DWORD WINAPI GetLastError(void);,他的作用是获取由系统API产生的错误代码,代码的详细信息可参考MSDN或是微软公布的错误代码获取API的错误信息, 当然,我们也可以直接让他显示出错误信息,如何操作呢,这就用到下面的函数
DWORD WINAPI FormatMessage( __in DWORD dwFlags, //指定格式化程序以及解释lpsource参数的方法 __in LPCVOID lpSource, //消息定义指针 __in DWORD dwMessageId, //为要求消息指定32位信息标识符 __in DWORD dwLanguageId, //不支持 __out LPTSTR lpBuffer, //指向一个格式化消息的缓冲区 __in DWORD nSize, //指定输出缓冲区大小 __in va_list* Arguments //指向在格式化消息中被用来插入数值的一个32位数值的数组 ); 具体信息可参看MSDN .
上对他的说明这里我们使用一个简单的例子来说明他们的用法 :
int a = GetDlgItemInt(IDC_EDIT4); int b = GetDlgItemInt(IDC_EDIT5); typedef int(_stdcall *lpAddFun)(int, int); HINSTANCE hDll; hDll = LoadLibrary(_T("Dll2.dll")); lpAddFun AddFun = (lpAddFun)GetProcAddress(hDll, "Subtract"); if (AddFun != NULL) { int c = AddFun(a, b); SetDlgItemInt(IDC_EDIT6,c); } else { LPVOID lpMsgBuf; LPVOID lpDisplayBuf; DWORD dw = GetLastError(); FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, dw, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMsgBuf, 0, NULL ); lpDisplayBuf = (LPVOID)LocalAlloc(LMEM_ZEROINIT, (lstrlen((LPCTSTR)lpMsgBuf)+40)*sizeof(TCHAR)); StringCchPrintf((LPTSTR)lpDisplayBuf, LocalSize(lpDisplayBuf), TEXT("failed with error %d: %s"), dw, lpMsgBuf); ::MessageBox(NULL, (LPCTSTR)lpDisplayBuf, TEXT("Error"), MB_OK); LocalFree(lpMsgBuf); LocalFree(lpDisplayBuf); } FreeLibrary(hDll);
这里是动态加载DLL,如果成功,后面代码将正确执行,如果错误,将返回错误信息的详细说明。其中,后面一部分代码可以直接使用,把他加入你的代码调用API可能出错的地方,他将给你提示出你的函数错误的描述信息。 DWORD dwErrCode 就是你想要设置的错误代码,不过要注意的是,你的错误代码不能和系统冲突,下面是系统已经定义的错误代码字段信息: 对于这两个函数的具体使用和这些字段的用法,请看下集故事:windows编程中的异常处理和windows结构化异常处理方式解析。
发表评论
-
visual studio 2008开发windows mobile应用程序之环境篇
2012-01-20 09:31 716visual studio 2008开发windows mob ... -
安装Phoenix-SDK-June-2008-RC1
2012-01-20 09:31 632安装Phoenix-SDK-June-2008-RC1 20 ... -
在Windows下安装Hadoop遇到的几个问题
2012-01-20 09:31 798在Windows下安装Hadoop遇到 ... -
Windows 7完美安装VC6和Delphi7
2012-01-20 09:30 764Windows 7完美安装VC6和Delp ... -
花木兰
2012-01-19 14:33 633花木兰 2011年12月28日 《旗袍》一句台词:“我宁 ... -
浅析春秋与战国儒家思想的不同
2012-01-19 14:33 674浅析春秋与战国儒家思 ... -
省级文化旅游古镇名单
2012-01-19 14:32 643省级文化旅游古镇名单 2011年12月24日 附件2: ... -
浙江大学:排名第一
2012-01-19 14:32 515浙江大学:排名第一 2011 ... -
汉服宣传资料
2012-01-19 14:32 688汉服宣传资料 2011年12月28日 什么是汉服? ... -
引用 javascript基础知识
2012-01-17 04:20 570引用 javascript基础知识 ... -
JavaScript高级程序设计 学习笔记
2012-01-17 04:19 532JavaScript高级程序设计 ... -
程序员书库actionscript3.0入门与精通讲义整理 第六章 数组
2012-01-17 04:19 655程序员书库actionscript3.0 ... -
javascript
2012-01-17 04:19 515javascript 2011年04月11日 ... -
AS3.0 中root和parent的用法
2012-01-17 04:19 575AS3.0 中root和parent的用法 ... -
节选王延广《超级赞美之不露痕迹》实战训练
2012-01-16 03:09 610节选王延广《超级赞美之不露痕迹》实战训练 2011年06月0 ... -
男人应享有动听词汇的权利
2012-01-16 03:09 623男人应享有动听词汇的权利 2009年08月26日 在 ... -
服装销售中,你的导购会赞美吗?
2012-01-16 03:09 512服装销售中,你的导购会 ... -
有一种语言是最能够打动人心,那就是 赞美
2012-01-16 03:09 747有一种语言是最能够打 ... -
《对于妻子的赞美不要吝啬词汇和语言,让她感受到丈夫在欣赏她!》 李伦 写于2011,5,30 河南安阳。
2012-01-16 03:09 977《对于妻子的赞美不要 ...
相关推荐
.NET Windows编程系列课程(30):错误和异常处理,介绍了许多.NET Windows编程系列课程(30):错误和异常处理的知识
例如,Windows PowerShell 2.0包含了一个编辑器,通过此编辑器,您可以随心所欲地编写代码,而随之附带的调试器可帮助您发现代码中的错误。本书的这一部分内容将详细而深入地探讨Windows PowerShell。事实上,您甚至...
45210.2.2 错误处理 45210.2.3 缓冲区参数 45210.2.4 异步I/O 45210.3 Internet函数 45310.3.1 常用Internet函数 45310.3.2 FTP客户端函数 45910.3.3 HTTP客户端函数 46110.3.4 Gopher客户端函数 46510.4 ...
windows内核编程,对程序错误的处理 在开始介绍 Microsoft Windows 的特性之前,必须首先了解 Window s的各个函数是如何进 行错误处理的。
2.1.4 Windows中的数据结构 15 2.2 Windows API的功能分类 15 2.2.1 系统基本服务 15 2.2.2 系统管理 17 2.2.3 用户界面 17 2.2.4 图像和多媒体 20 2.2.5 网络 20 2.2.6 系统安全 20 2.2.7 其他...
一、本下载文件是《C/C++图像处理编程》一书的演示程序,该书由清华大学 出版社出版。 二、将 "C与C++图像处理编程\"目录全部拷贝到任意盘的根目录上。 三、运行 X:\C与C++图像处理编程\DosImage.exe程序,演示...
2.1.4 Windows中的数据结构 15 2.2 Windows API的功能分类 15 2.2.1 系统基本服务 15 2.2.2 系统管理 17 2.2.3 用户界面 17 2.2.4 图像和多媒体 20 2.2.5 网络 20 2.2.6 系统安全 20 2.2.7 其他...
行错误处理的。 当调用一个Wi n d o w s函数时,它首先要检验传递给它的的各个参数的有效性,然后再设法 执行任务。如果传递了一个无效参数,或者由于某种原因无法执行这项操作,那么操作系统就 会返回一个值,指明...
第1章 Windows编程概述 . 1.1 Win32程序概述 1.2 图形界面编程 1.3 消息传递机制 1.4 Win32 API概述 1.5 为什么用API 1.6 如何在程序中调用API函数 1.7 本书示例约定 第2章 窗口处理 第3章 设备上...
7.4 使用*匹配字符串中的单字符或其重复 序列 51 7.5 使用\屏蔽一个特殊字符的含义 52 7.6 使用[]匹配一个范围或集合 52 7.7 使用\{\}匹配模式结果出现的次数 53 7.8 小结 55 第8章 grep家族 56 8.1 grep 57 8.1.1 ...
第19章 错误处理 第20章 数据库控件和对象 第21章 LINQ 第22章 自定义控件 第23章 拖动、释放和剪贴板 第24章 UAC安全功能 第Ⅲ部分 面向对象编程 第25章 OOP概念 第26章 类和结构体 第27章 名称空间 第28章 集合类 ...
行错误处理的。 当调用一个Wi n d o w s函数时,它首先要检验传递给它的的各个参数的有效性,然后再设法 执行任务。如果传递了一个无效参数,或者由于某种原因无法执行这项操作,那么操作系统就 会返回一个值,指明...
《Windows Sockets网络编程》是WindowsSockets网络编程领域公认的经典著作,由Windows Sockets2.0规范解释小组负责人亲自执笔,权威性毋庸置疑。它结合大量示例,对WindowsSockets规范进行了深刻地解读,系统讲解了...
本书以详尽资料和大量的范例深入讨论了有关32位Windows编程的高级问题,包括进程和线程的管理、Win32的内存管理、消息处理、动态链接库、文件系统和设备输入输出、结构化异常处理、Unicode等,并重点讨论了Windows ...
《Windows Sockets网络编程》是WindowsSockets网络编程领域公认的经典著作,由Windows Sockets2.0规范解释小组负责人亲自执笔,权威性毋庸置疑。它结合大量示例,对WindowsSockets规范进行了深刻地解读,系统讲解了...
2.1.3 套接字编程接口在Windows和Linux操作系统中得到继承和发展 25 2.1.4 套接字编程接口的两种实现方式 25 2.1.5 套接字通信与UNIX操作系统的输入/输出的关系 26 2.2 套接字编程的基本概念 27 2.2.1 什么...
一、本下载文件是《C/C++图像处理编程》一书的演示程序,该书由清华大学 出版社出版。 <br>二、将 "C与C++图像处理编程\"目录全部拷贝到任意盘的根目录上。 <br>三、运行 X:\C与C++图像处理编程\DosImage....
MSComm控件通信功能的实现,还是间接调用Windows API编程的结构。他提供了一系列标准通信命令的使用接口,利用它可以建立与串口的连接,并可以通过串口连接到其他设备,发出命令,交换数据以及见识和响应串行连接中...