小Q 发表于 2008-12-19 20:17

天书夜读之Windows核心编程(1)

当调用一个windows函数时.他首先要检验传递给他的各个参数的有效性.只有在参数完全符合定义的情况下.函数才会运行.如果船体了一个无效参数.或者由于某种原因无法执行这个函数..那么操作系统就会返回一个值.指出这个函数在某种程度上运行失败了..其中返回值有:
VOID .使用这个返回值时函数运行不可能失败.也就是什么都不返回.很少使用.
BOOL .如果函数运行失败.那么返回值是0.否则返回非0的值.
HANDLE .如果函数运行失败的话.返回值通常是null.否则返回值为handle(句柄). handle用于标示你可以操作的一个对象(这在之前已经详细说过.深入windows的执行体中的对象管理器章节).当然.有些函数会返回一个句柄值.INVALID_HANDLE_VALUE.他被定义为-1.
PVOID .如果函数运行失败.返回值是NULL.否则返回PVOID.以标识数据块的内存地址.
LONG/DWORD .这个返回值很难处理.返回数量的函数通常返回LONG.或DWORD.如果由于某种原因.函数无法对想要进行计数的对象进行计数.那么函数会返回0或者-1.至于详细的可以查看平台SDK
一个windows函数返回的错误代码对了解该函数为什么会运行失败常常很有用.微软公司编译了一个所有可能的错误代码的列表.并且为每个错误代码分配了一个32位的号码.
从系统内部来讲..当一个windows函数检测到一个错误时.它会使用一个称为线程本地存储器的机制.将相应的错误代码号码与调用的线程关联起来.这将使线程能够互相独立运行.而不会影响各自的错误代码..当函数返回时.他的返回值就能指明一个错误已经发生.这取决与一个函数
DWORD GetLastError()
这个函数返回线程的32位错误代码.
当你拥有32位错误代码的号码时.必须将该号码转换成更有用的某种对象.WinError.h头文件包含了微软定义错误代码的列表.这个列表中将指定的各种错误.如打开的文件未发现等.转换为错误代码..每个错误都有3种表示法.:一个消息ID.消息文本.(对应的错误的英文描述)和一个号码(都使用消息ID.这个可以避免使用.)
当一个函数运行失败时.应该立即调用GetLastError函数.如果调用另一个windows函数.他的值有可能被改写.
GetLastError返回线程传声的最后一个错误.如果线程调用的windows函数运行成功.那么最后一个错误代码就不被改写.并且不指明运行成功..当然.有少数的windows比较特殊.他会更改最后错误代码.但是是平台SDK通常指明.当函数运行成功后.该函数会更改最后的错误代码
当然.在windows98上的函数使用16位代码来实现的.这种老的代码不通过GetLastError之类的函数来报告错误.
第二章的Unicode由于我早已看过.所以这里略过
页: [1]
查看完整版本: 天书夜读之Windows核心编程(1)