Thread overview
Windows app crashes on exit
Jan 14, 2004
Stewart Gordon
Jan 15, 2004
Stewart Gordon
Jan 15, 2004
yaneurao
Jan 16, 2004
Walter
January 14, 2004
Using DMD 0.77, Windows 98SE.

I'm experimenting with writing a Windows application framework rather in the style of Borland OWL.  The code below is a simplification of this.

The base version (i.e. no -version compiler switch) runs without any trouble.

Version 1 is, of course, supposed to make multiple windows (and, of course, dialogs) possible.  It still manages to do nothing without any trouble.  However, as soon as I close it, I get an illegal operation error:

WINTEST caused an invalid page fault in
module KERNEL32.DLL at 0167:bff8ac13.

I can't for the life of me figure why this is happening.  What is going on here?  Any idea how to fix it?

Stewart.

----------

import std.c.windows.windows;

version (1) {
	Window[HWND] windowList;
	Window newWindow;

	extern(Windows)
	int WindowProc(HWND hWnd, uint uMsg, WPARAM wParam, LPARAM lParam) {
		Window w;

		if (!(hWnd in windowList)) {
			windowList[hWnd] = w = newWindow;
			newWindow = null;
		} else {
			w = windowList[hWnd];
		}

		return w.processMessage(hWnd, uMsg, wParam, lParam);
	}
} else {
	Window w;

	extern(Windows)
	int WindowProc(HWND hWnd, uint uMsg, WPARAM wParam, LPARAM lParam) {
		return w.processMessage(hWnd, uMsg, wParam, lParam);
	}
}

class Window {

	int processMessage(HWND hWnd, uint uMsg, WPARAM wParam, LPARAM lParam) {
		switch (uMsg) {
			case WM_DESTROY:
				PostQuitMessage(0);
				break;

			default:
				break;
		}
		return DefWindowProcA(hWnd, uMsg, wParam, lParam);
	}

	int run() {
		HINSTANCE hInst = GetModuleHandleA(null);

		WNDCLASS wc;
		wc.lpszClassName = "DWndClass";
		wc.style = CS_OWNDC | CS_HREDRAW | CS_VREDRAW;
		wc.lpfnWndProc = &WindowProc;
		wc.hInstance = hInst;
		wc.hIcon = LoadIconA(cast(HINSTANCE) null, IDI_APPLICATION);
		wc.hCursor = LoadCursorA(cast(HINSTANCE) null, cast(LPSTR) 32512);
		wc.hbrBackground = cast(HBRUSH) (COLOR_WINDOW + 1);
		wc.lpszMenuName = null;
		wc.cbClsExtra = wc.cbWndExtra = 0;

		assert(RegisterClassA(&wc));

		HWND hWnd;

		version(1) {
			synchronized {
				newWindow = this;

				hWnd = CreateWindowA("DWndClass", "Just a window", WS_THICKFRAME |
					WS_MAXIMIZEBOX | WS_MINIMIZEBOX | WS_SYSMENU | WS_VISIBLE,
					CW_USEDEFAULT, CW_USEDEFAULT, 400, 300, HWND_DESKTOP,
					cast(HMENU) null, hInst, null);
			}

		} else {
			hWnd = CreateWindowA("DWndClass", "Just a window", WS_THICKFRAME |
				WS_MAXIMIZEBOX | WS_MINIMIZEBOX | WS_SYSMENU | WS_VISIBLE,
				CW_USEDEFAULT, CW_USEDEFAULT, 400, 300, HWND_DESKTOP,
				cast(HMENU) null, hInst, null);
		}
		assert(hWnd);

		MSG msg;
		while (GetMessageA(&msg, cast(HWND) null, 0, 0)) {
			TranslateMessage(&msg);
			DispatchMessageA(&msg);
		}

		return 1;
	}

}

int doit() {
	version (1) {
		Window w;
	}
	w = new Window;
	return w.run();
}

extern (C) void gc_init();
extern (C) void gc_term();
extern (C) void _minit();
extern (C) void _moduleCtor();
extern (C) void _moduleUnitTests();

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

    gc_init();			// initialize garbage collector
    _minit();			// initialize module constructor table

    try {
		_moduleCtor();		// call module constructors
		_moduleUnitTests();	// run unit tests (optional)

		result = doit();	// insert user code here
    }

    catch (Object o) {		// catch any uncaught exceptions
		MessageBoxA(null, (char *)o.toString(), "Runtime Error",
				MB_OK | MB_ICONEXCLAMATION);
		result = 0;		// failed
    }

    gc_term();			// run finalizers; terminate garbage collector
    return result;
}

-- 
My e-mail is valid but not my primary mailbox, aside from its being the unfortunate victim of intensive mail-bombing at the moment.  Please keep replies on the 'group where everyone may benefit.
January 15, 2004
While it was 14/1/04 1:30 pm throughout the UK, Stewart Gordon sprinkled little black dots on a white screen, and they fell thus:

> Using DMD 0.77, Windows 98SE.
<snip>
> WINTEST caused an invalid page fault in
> module KERNEL32.DLL at 0167:bff8ac13.
> 
> I can't for the life of me figure why this is happening.  What is going on here?  Any idea how to fix it?
<snip>

Well if nobody's found the solution, it seems I've found it.  Just upgraded to DMD 0.78 and it seems to work now.

Stewart.

-- 
My e-mail is valid but not my primary mailbox, aside from its being the unfortunate victim of intensive mail-bombing at the moment.  Please keep replies on the 'group where everyone may benefit.
January 15, 2004
In article <bu5v03$1qkr$1@digitaldaemon.com>, Stewart Gordon says...
>> Using DMD 0.77, Windows 98SE.
><snip>
>> WINTEST caused an invalid page fault in
>> module KERNEL32.DLL at 0167:bff8ac13.
>Well if nobody's found the solution, it seems I've found it.  Just upgraded to DMD 0.78 and it seems to work now.

I had reported it and fixed in DMD 0.78. http://www.digitalmars.com/drn-bin/wwwnews?D/21167

yaneurao.


January 16, 2004
"yaneurao" <yaneurao_member@pathlink.com> wrote in message news:bu69fq$2b6s$1@digitaldaemon.com...
> I had reported it and fixed in DMD 0.78. http://www.digitalmars.com/drn-bin/wwwnews?D/21167

Yes, thanks to you!