Web lists-archives.org

Re: [Mingw-users] GCC 4.3.0 20080502 (alpha) Released - Please helpus test it!




Bob Rossi wrote:

> What exactly does this mean? What will be the exact limitation put on
> the mingw community?

This the old "win32 callbacks" problem.  "Foreign" means a frame that
was compiled without Dwarf-2 unwind tables, as occurs in Windows GUI
programming when the window procedure gets invoked as a callback from
the operating system.  If you try to throw an exception in the window
procedure the unwinder can't unwind through the user32/kernel32/whatever
frame because it has no unwind information (and those DLLs have FPO
enabled.)

Below is a simple testcase, run it from a console and it will create a
window.  Close the window and you should see "done!" printed to stdout. 
If you build this with any Dwarf-2 enabled compiler however you'll see
it abort with an unhandled exception: 

This application has requested the Runtime to terminate it in an unusual
way.
Please contact the application's support team for more information.

#include <stdexcept>
#include <iostream>
#include <windows.h>

LRESULT CALLBACK
WndProc (HWND hwnd, UINT uiMsg, WPARAM wParam, LPARAM lParam)
{
  switch (uiMsg)
    {
      case WM_CREATE:
        return TRUE;
      case WM_DESTROY:
        throw std::runtime_error ("done!");
        break;
      default:
        return DefWindowProc (hwnd, uiMsg, wParam, lParam);
    }
}

int WINAPI WinMain(HINSTANCE hinst, HINSTANCE hinstPrev,
                   LPSTR lpCmdLine, int nShowCmd)
{
  WNDCLASS c;
  MSG m;
  HWND h;
  
  memset (&c, 0, sizeof (c));
  c.hCursor = LoadCursor(NULL, IDC_ARROW);
  c.lpfnWndProc = WndProc;
  c.hInstance = hinst;
  c.lpszClassName = "foo";
  
  RegisterClass (&c);
  h = CreateWindow ("foo", "foo", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT,
                    CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL,
                    NULL, hinst, 0);
  ShowWindow (h, nShowCmd);

  try
    {
      while (GetMessage (&m, NULL, 0, 0))
        {
          TranslateMessage (&m);
          DispatchMessage (&m);
        }
    }
  catch (std::exception &e)
    {
      std::cout << e.what ();
    }
  return 0; 
}

-------------------------------------------------------------------------
This SF.net email is sponsored by the 2008 JavaOne(SM) Conference 
Don't miss this year's exciting event. There's still time to save $100. 
Use priority code J8TL2D2. 
http://ad.doubleclick.net/clk;198757673;13503038;p?http://java.sun.com/javaone
_______________________________________________
MinGW-users mailing list
MinGW-users@xxxxxxxxxxxxxxxxxxxxx

You may change your MinGW Account Options or unsubscribe at:
https://lists.sourceforge.net/lists/listinfo/mingw-users