`
ugotd61y
  • 浏览: 12978 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

Windows编程中的错误处理

 
阅读更多

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结构化异常处理方式解析。
分享到:
评论

相关推荐

    .NET Windows编程系列课程(30):错误和异常处理

    .NET Windows编程系列课程(30):错误和异常处理,介绍了许多.NET Windows编程系列课程(30):错误和异常处理的知识

    Windows 7高级编程

    例如,Windows PowerShell 2.0包含了一个编辑器,通过此编辑器,您可以随心所欲地编写代码,而随之附带的调试器可帮助您发现代码中的错误。本书的这一部分内容将详细而深入地探讨Windows PowerShell。事实上,您甚至...

    Windows网络编程

    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对程序错误的处理.pdf

    windows内核编程,对程序错误的处理 在开始介绍 Microsoft Windows 的特性之前,必须首先了解 Window s的各个函数是如何进 行错误处理的。

    精通WindowsAPI 函数 接口 编程实例

    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与C++图像处理编程\"目录全部拷贝到任意盘的根目录上。 三、运行 X:\C与C++图像处理编程\DosImage.exe程序,演示...

    精通Windows.API-函数、接口、编程实例.pdf

    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 其他...

    WindowsPrograming11-20 Windows编程

    行错误处理的。 当调用一个Wi n d o w s函数时,它首先要检验传递给它的的各个参数的有效性,然后再设法 执行任务。如果传递了一个无效参数,或者由于某种原因无法执行这项操作,那么操作系统就 会返回一个值,指明...

    Windows+API+程序设计参考大全光盘

    第1章 Windows编程概述 . 1.1 Win32程序概述 1.2 图形界面编程 1.3 消息传递机制 1.4 Win32 API概述 1.5 为什么用API 1.6 如何在程序中调用API函数 1.7 本书示例约定 第2章 窗口处理 第3章 设备上...

    shell 编程指南pdf

    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 ...

    Visual.Basic.2008编程参考手册.pdf

    第19章 错误处理 第20章 数据库控件和对象 第21章 LINQ 第22章 自定义控件 第23章 拖动、释放和剪贴板 第24章 UAC安全功能 第Ⅲ部分 面向对象编程 第25章 OOP概念 第26章 类和结构体 第27章 名称空间 第28章 集合类 ...

    WindowsPrograming Windows编程

    行错误处理的。 当调用一个Wi n d o w s函数时,它首先要检验传递给它的的各个参数的有效性,然后再设法 执行任务。如果传递了一个无效参数,或者由于某种原因无法执行这项操作,那么操作系统就 会返回一个值,指明...

    Windows Sockets网络编程 可能是最清晰版本(Windows Sockets 2规范解释小组负责人亲自执笔。)总共4个包,part1

    《Windows Sockets网络编程》是WindowsSockets网络编程领域公认的经典著作,由Windows Sockets2.0规范解释小组负责人亲自执笔,权威性毋庸置疑。它结合大量示例,对WindowsSockets规范进行了深刻地解读,系统讲解了...

    《Windows高级编程指南(第三版)》(含PASCAL例子)

    本书以详尽资料和大量的范例深入讨论了有关32位Windows编程的高级问题,包括进程和线程的管理、Win32的内存管理、消息处理、动态链接库、文件系统和设备输入输出、结构化异常处理、Unicode等,并重点讨论了Windows ...

    Windows Sockets网络编程 总计4个包,part2

    《Windows Sockets网络编程》是WindowsSockets网络编程领域公认的经典著作,由Windows Sockets2.0规范解释小组负责人亲自执笔,权威性毋庸置疑。它结合大量示例,对WindowsSockets规范进行了深刻地解读,系统讲解了...

    网络编程实用教程(第三版).zip

    2.1.3 套接字编程接口在Windows和Linux操作系统中得到继承和发展 25 2.1.4 套接字编程接口的两种实现方式 25 2.1.5 套接字通信与UNIX操作系统的输入/输出的关系 26 2.2 套接字编程的基本概念 27 2.2.1 什么...

    《C++图像处理编程》一书的演示程序

    一、本下载文件是《C/C++图像处理编程》一书的演示程序,该书由清华大学 出版社出版。 <br>二、将 "C与C++图像处理编程\"目录全部拷贝到任意盘的根目录上。 <br>三、运行 X:\C与C++图像处理编程\DosImage....

    MSComm控件通信功能的实现,还是间接调用Windows API编程的结构

    MSComm控件通信功能的实现,还是间接调用Windows API编程的结构。他提供了一系列标准通信命令的使用接口,利用它可以建立与串口的连接,并可以通过串口连接到其他设备,发出命令,交换数据以及见识和响应串行连接中...

Global site tag (gtag.js) - Google Analytics