我們知道,在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)<br />{<br />switch (w32error) {<br />case ERROR_INVALID_FUNCTION:<br />return EBADRQC;<br />case ERROR_FILE_NOT_FOUND:<br />case ERROR_PATH_NOT_FOUND:<br />case ERROR_INVALID_NAME:<br />return ENOENT;<br />case ERROR_TOO_MANY_OPEN_FILES:<br />return EMFILE;<br />case ERROR_ACCESS_DENIED:<br />return EACCES;<br />case ERROR_INVALID_HANDLE:<br />return EBADF;<br />case ERROR_NOT_ENOUGH_MEMORY:<br />return ENOMEM;<br />case ERROR_OUTOFMEMORY:<br />return ENOSPC;<br />case ERROR_INVALID_DRIVE:<br />case ERROR_BAD_UNIT:<br />return ENODEV;<br />case ERROR_WRITE_PROTECT:<br />return EROFS;<br />case ERROR_NOT_READY:<br />case ERROR_SHARING_VIOLATION:<br />return EBUSY;<br />case ERROR_BAD_COMMAND:<br />return EINVAL;<br />case ERROR_SEEK:<br />case ERROR_NEGATIVE_SEEK:<br />return ESPIPE;<br />case ERROR_NOT_SUPPORTED:<br />return EOPNOTSUPP;<br />case ERROR_BAD_NETPATH:<br />return ENOSHARE;<br />default:<br />/* generic message */<br />return ENOMSG;<br />}<br />}
那麼,如果我們想輸出錯誤資訊,就可以這樣了
errno = w32error_to_errno(GetLastError());<br />strerror(errno);
雖然,不能獲得完全準確的錯誤資訊,但這個對於誇win32和linux的編程來說,至少可以省下一部分麻煩。