none
为什么我的这个简单的窗口程序会出错? RRS feed

  • 问题

  • GUI_test.exe 中的 0x77d2906c 处未处理的异常: 0xC0000005: 写入位置 0x00cc0088 时发生访问冲突
    但编译的时候完全正确。


    #include <windows.h>

    /*  Declare Windows procedure  */
    LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);

    /*  Make the class name into a global variable  */
    char szClassName[ ] = "WindowsApplication";

    int WINAPI WinMain (HINSTANCE hThisInstance,
                        HINSTANCE hPrevInstance,
                        LPSTR lpszArgument,
                        int nCmdShow)
    {
        HWND hwnd;              /* This is the handle for our window */
        MSG messages;            /* Here messages to the application are saved */
        WNDCLASSEX wincl;        /* Data structure for the windowclass */

        /* The Window structure */
        wincl.hInstance = hThisInstance;
        wincl.lpszClassName = szClassName;
        wincl.lpfnWndProc = WindowProcedure;      /* This function is called by windows */
        wincl.style = CS_DBLCLKS;                /* Catch double-clicks */
        wincl.cbSize = sizeof (WNDCLASSEX);

        /* Use default icon and mouse-pointer */
        wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
        wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
        wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
        wincl.lpszMenuName = NULL;                /* No menu */
        wincl.cbClsExtra = 0;                      /* No extra bytes after the window class */
        wincl.cbWndExtra = 0;                      /* structure or the window instance */
        /* Use Windows's default colour as the background of the window */
        wincl.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);

        /* Register the window class, and if it fails quit the program */
        //if (!RegisterClassEx (&wincl))
        //    return 0;
    RegisterClassEx (&wincl);

        /* The class is registered, let's create the program*/
        hwnd = CreateWindowEx (
              0,                  /* Extended possibilites for variation */
              szClassName,        /* Classname */
              "Windows Application",      /* Title Text */
              WS_OVERLAPPEDWINDOW, /* default window */
              CW_USEDEFAULT,      /* Windows decides the position */
              CW_USEDEFAULT,      /* where the window ends up on the screen */
              CW_USEDEFAULT,      /* The programs width */
              CW_USEDEFAULT,      /* and height in pixels */
              HWND_DESKTOP,        /* The window is a child-window to desktop */
              NULL,                /* No menu */
              hThisInstance,      /* Program Instance handler */
              NULL                /* No Window Creation data */
              );

        /* Make the window visible on the screen */
        ShowWindow(hwnd,nCmdShow);

        UpdateWindow(hwnd);

        /* Run the message loop. It will run until GetMessage() returns 0 */
        while (GetMessage (&messages, NULL, 0, 0))
        {
            /* Translate virtual-key messages into character messages */
            TranslateMessage(&messages);
            /* Send message to WindowProcedure */
            DispatchMessage(&messages);
        }

        /* The program return-value is 0 - The value that PostQuitMessage() gave */
        return messages.wParam;
    }
    /*  This function is called by the Windows function DispatchMessage()  */

    LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
        HDC hdc;
        PAINTSTRUCT ps; 
        LPRECT rect;
        switch(message)                  /* handle the messages */
        {
            case WM_DESTROY:
                PostQuitMessage(0);      /* send a WM_QUIT to the message queue */
                break;
    case WM_PAINT:
                hdc=BeginPaint(hwnd,&ps);
        GetClientRect(hwnd,rect);
      DrawText(hdc,"Hello,Windows XP!",-1,rect,
                        DT_TOP);
      DrawText(hdc,"Hello,Windows Vista!",-1,rect,
                        DT_SINGLELINE | DT_CENTER | DT_VCENTER);
            EndPaint(hwnd,&ps);
                break;
            default:                      /* for messages that we don't deal with */
                return DefWindowProc(hwnd,message,wParam,lParam);
        }
        return 0;
    }

    • 已移动 孟宪会Moderator 2009年5月19日 9:48 ([Loc]From:Windows Vista 开发相关讨论)
    2008年10月1日 9:24

答案

  • 估计有野指针。建议您找到抛出异常部分的stack,然后看执行到哪里出现问题,查一下具体的指针访问操作。

    2008年10月8日 6:46
    版主
  • 算了,我觉得VisualStudio的小毛病太多了,代码量又大,图形界面编程我已决定转移阵地到GTK编程了,他比VC++强多了,程序码量又少,易读,还跨平台,不易出错~除非你们有谁能说服我VC++比GTK优秀(除了可视化编程以外),我再考虑回VC++

    2008年10月11日 2:44

全部回复

  • ……已经用InvalidateRect函数解决问题了,但为什么这里的updatewindow函数不能在改变窗口大小时使位于中央的文字继续保持在中央呢?
    2008年10月1日 15:35
  •  

    PS:另外还发生了一件非常奇怪的事在VS里Debug或Release模式下运行完全正常,但找到exe文件所在目录,双击运行就报错:内存不能为read

    这是为什么呢?

    2008年10月5日 2:11
  • 估计有野指针。建议您找到抛出异常部分的stack,然后看执行到哪里出现问题,查一下具体的指针访问操作。

    2008年10月8日 6:46
    版主
  • 算了,我觉得VisualStudio的小毛病太多了,代码量又大,图形界面编程我已决定转移阵地到GTK编程了,他比VC++强多了,程序码量又少,易读,还跨平台,不易出错~除非你们有谁能说服我VC++比GTK优秀(除了可视化编程以外),我再考虑回VC++

    2008年10月11日 2:44
  • RegisterClassEx   WNDCLASSEX  这两个是用的宽字符 还是 ASC码?
    2020年10月6日 3:30