我们知道,在linux下,我们用errno来查看API返回的错误码,并用strerror(errno)来获得错误信息。
而在windows下也有这的错误码,可以用GetLastError 来获得,在windows下,要获得错误码对应的信息就没有linux下那么方便了。
其获得方式可以参考《windows核心编程》。
但我们也可以用linux下的api来获得windows下的错误信息,其条件就是把windows下的错误码转换成linux下相应的错误码,然后再调用
strerror(errno)来获得错误信息。
如果我们在windows下用cygwin来写程序,那么从windows下的API获得的错误吗,如果用linux下的函数strerror(errno)来显示的话,那么我们就要做一个win32错误码和linux下错误码的一个简单转换。
这个简单转换的函数如下:
int w32error_to_errno(unsigned int w32error) { switch (w32error) { case ERROR_INVALID_FUNCTION: return EBADRQC; case ERROR_FILE_NOT_FOUND: case ERROR_PATH_NOT_FOUND: case ERROR_INVALID_NAME: return ENOENT; case ERROR_TOO_MANY_OPEN_FILES: return EMFILE; case ERROR_ACCESS_DENIED: return EACCES; case ERROR_INVALID_HANDLE: return EBADF; case ERROR_NOT_ENOUGH_MEMORY: return ENOMEM; case ERROR_OUTOFMEMORY: return ENOSPC; case ERROR_INVALID_DRIVE: case ERROR_BAD_UNIT: return ENODEV; case ERROR_WRITE_PROTECT: return EROFS; case ERROR_NOT_READY: case ERROR_SHARING_VIOLATION: return EBUSY; case ERROR_BAD_COMMAND: return EINVAL; case ERROR_SEEK: case ERROR_NEGATIVE_SEEK: return ESPIPE; case ERROR_NOT_SUPPORTED: return EOPNOTSUPP; case ERROR_BAD_NETPATH: return ENOSHARE; default: /* generic message */ return ENOMSG; } }
那么,如果我们想输出错误信息,就可以这样了
errno = w32error_to_errno(GetLastError()); strerror(errno);
虽然,不能获得完全准确的错误信息,但这个对于夸win32和linux的编程来说,至少可以省下一部分麻烦。