digitalmars.D.learn - ErrnoException in Windows
- novice2 (20/20) Mar 01 2015 Could you, please, help me to understand, why code:
- ketmar (6/7) Mar 01 2015 'cause winapi functions never sets `errno`. `errno` is a libc feature,=2...
- Vladimir Panteleev (16/18) Mar 01 2015 Here's the right way to do this:
Could you, please, help me to understand, why code: //////////////// import std.c.windows.windows; import std.exception: ErrnoException; import std.stdio: writefln; import std.string: toStringz; void main () { CreateFileA(toStringz("nonexisting file name"), GENERIC_READ, FILE_SHARE_READ, null, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, null); auto ex = new ErrnoException("CreateFileA"); writefln("ex.errno=%d, ex.msg=%s, lasterror=%d", ex.errno, ex.msg, GetLastError()); } //////////////// prints: ex.errno=0, ex.msg=CreateFileA (No error), lasterror=2 I wanted it will be: ex.errno=2, ex.msg=CreateFileA (File not found), lasterror=2
Mar 01 2015
On Sun, 01 Mar 2015 16:39:27 +0000, novice2 wrote:Could you, please, help me to understand, why code:'cause winapi functions never sets `errno`. `errno` is a libc feature,=20 and winapi knows nothing about libc. besides, `GetLastError()` is not=20 required to return correct errno codes. so you have to either use libc funcions, or translate `GetLastError()`=20 codes to errno manually.=
Mar 01 2015
On Sunday, 1 March 2015 at 16:39:29 UTC, novice2 wrote:I wanted it will be: ex.errno=2, ex.msg=CreateFileA (File not found), lasterror=2Here's the right way to do this: ////////////////////////// test.d ////////////////////////// import std.c.windows.windows; import std.string : toStringz; import std.windows.syserror : wenforce; void main () { auto handle = CreateFileA(toStringz("nonexisting"), GENERIC_READ, FILE_SHARE_READ, null, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, null); wenforce(handle != INVALID_HANDLE_VALUE, "CreateFileA"); } //////////////////////////////////////////////////////////// See std.windows.syserror for more information.
Mar 01 2015
Thans guys! wenforce not sutable - error code is lost. may be, i will use modified wenforce, wich throws ErrnoException.
Mar 01 2015
Ha, i found std.windows.syserror: WindowsException, wenforce;
Mar 01 2015