std.stdio.File is throwing with the message of: "Access Violation"

Ruby The Roobster michaeleverestc79 at gmail.com
Fri Aug 20 21:19:09 UTC 2021


On Friday, 20 August 2021 at 05:22:20 UTC, nov wrote:
> On Friday, 20 August 2021 at 04:27:34 UTC, Jesse Phillips wrote:
>>> For me, this code generates the Message Box. Does this happen 
>>> for you?
>
> no errors
> https://run.dlang.io/is/4tlm3p
> ```D
> void main() {
>     try {
>        import std.stdio: File;
>        File file = File(__FILE__,"r");
>        file.close();
>    }
>    catch(Throwable e) {
>        import std.stdio: writefln;
>        writefln("err=%s", e.msg);
>    }
> }
> ```

This is not a console App. It's a Win32 one. Also, it turns out 
to be a bug.  If I compile my application(with a couple of 
'imports' removed under dmd 2.060), it works just fine, with no 
Access Violation Error.  Try the following on dmd 2.060:
```d
import core.runtime;

pragma(lib, "gdi32.lib");

import core.sys.windows.windows;
import std.stdio;

extern(Windows)
int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR 
lpCmdLine, int iCmdShow)
{
     int result;

     try
     {
         Runtime.initialize();
         result = myWinMain(hInstance, hPrevInstance, lpCmdLine, 
iCmdShow);
         Runtime.terminate();
     }
     catch(Throwable o)
     {
         MessageBoxA(null, o.msg, "Error", MB_OK | MB_ICONERROR);
         result = 1;
     }

     return result;
}

int myWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR 
lpCmdLine, int iCmdShow)
{
     HWND hwnd;
     MSG  msg;
     WNDCLASSA wndclass;

     wndclass.style         = CS_HREDRAW | CS_VREDRAW;
     wndclass.lpfnWndProc   = &WndProc;
     wndclass.cbClsExtra    = 0;
     wndclass.cbWndExtra    = 0;
     wndclass.hInstance     = hInstance;
     wndclass.hIcon         = LoadIconA(NULL, IDI_APPLICATION);
     wndclass.hCursor       = LoadCursorA(NULL, IDC_ARROW);
     wndclass.hbrBackground = 
cast(HBRUSH)GetStockObject(WHITE_BRUSH);
     wndclass.lpszMenuName  = NULL;
     wndclass.lpszClassName = appName.toUTF16z;

     if(!RegisterClassA(&wndclass))
     {

         return 0;
     }

     hwnd = CreateWindowA( "Test",
                          "Test",
                          WS_OVERLAPPEDWINDOW,
                          CW_USEDEFAULT,
                          CW_USEDEFAULT,
                          CW_USEDEFAULT,
                          CW_USEDEFAULT,
                          NULL,
                          NULL,
                          hInstance,
                          NULL);

     ShowWindow(hwnd, iCmdShow);
     UpdateWindow(hwnd);

     while (GetMessageA(&msg, NULL, 0, 0))
     {
         TranslateMessageA(&msg);
         DispatchMessage(&msg);
     }

     return msg.wParam;
}

extern(Windows)
LRESULT WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM 
lParam) nothrow
{
     switch (message)
     {
         case WM_CREATE:
             try
             {
                File file = File("test","r");
                file.close();
             }
             catch(Throwable e)
             {
                MessageBoxA(null, "Error", 
cast(char)[])e.msg,MB_OK | ICON_ERROR);
                PostQuitMessage(1);
             }
             return 0;
         case WM_DESTROY:
             PostQuitMessage(0);
             return 0;

         default:
     }

     return DefWindowProcA(hwnd, message, wParam, lParam);
}
```
Sorry if I misnamed(forgot an 'A' at the end of the function 
name) something in above code.

Now, edit above code(provided that it has been fixed if 
necessary) by adding:
```d
import core.sys.windows.wingdi;
```
And remove:
```d
import core.sys.windows.windows;
```
And compile it with dmd 2.080.0 or later.

See the results(what matters is if you get the "Access Violation" 
error or not, everything else is irrelevant).


More information about the Digitalmars-d-learn mailing list