在createwindow GetLastError之后返回代码126,但是windows是在win7 vc express中创建的

时间:2012-06-23 16:05:55

标签: windows winapi getlasterror

我在win7 pc中使用VC 2010,并且在WNDCLASSEX结构上创建窗口设置lpszMenuName = 0时我得到了一个错误126,窗口是创建但得到GetLastError代码可能是我刚创建的项目如果我将lpszMenuName设置为0,它将生成向导及其生成的相同代码,以创建带菜单的简单窗口。



    #include "stdafx.h"
    #include "simple.h"
    #define MAX_LOADSTRING 100
    // Global Variables:
    HINSTANCE hInst;                    // current instance
    TCHAR szTitle[MAX_LOADSTRING];              // The title bar text
    TCHAR szWindowClass[MAX_LOADSTRING];            // the main window class name

    // Forward declarations of functions included in this code module:
    ATOM                MyRegisterClass(HINSTANCE hInstance);
    BOOL                InitInstance(HINSTANCE, int);
    LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
    INT_PTR CALLBACK    About(HWND, UINT, WPARAM, LPARAM);

    int APIENTRY _tWinMain(HINSTANCE hInstance,
                         HINSTANCE hPrevInstance,
                         LPTSTR    lpCmdLine,
                         int       nCmdShow)
    {


        UNREFERENCED_PARAMETER(hPrevInstance);
        UNREFERENCED_PARAMETER(lpCmdLine);



        // TODO: Place code here.

            MSG msg;
            HACCEL hAccelTable;

            // Initialize global strings
            LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
            LoadString(hInstance, IDC_SIMPLE, szWindowClass, MAX_LOADSTRING);
            MyRegisterClass(hInstance);

            // Perform application initialization:
            if (!InitInstance (hInstance, nCmdShow))
            {
                return FALSE;
            }

            hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_SIMPLE));

            // Main message loop:
            while (GetMessage(&msg, NULL, 0, 0))
            {
                if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
                {
                    TranslateMessage(&msg);
                    DispatchMessage(&msg);
                }
            }

            return (int) msg.wParam;

    }

在注册窗口时我在此函数中设置wcex.lpszMenuName = 0



    ATOM MyRegisterClass(HINSTANCE hInstance)
    {
        WNDCLASSEX wcex;

        wcex.cbSize = sizeof(WNDCLASSEX);

        wcex.style          = CS_HREDRAW | CS_VREDRAW;
        wcex.lpfnWndProc    = WndProc;
        wcex.cbClsExtra     = 0;
        wcex.cbWndExtra     = 0;
        wcex.hInstance      = hInstance;
        wcex.hIcon          = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_SIMPLE));
        wcex.hCursor        = LoadCursor(NULL, IDC_ARROW);
        wcex.hbrBackground  = (HBRUSH)(COLOR_WINDOW+1);
        wcex.lpszMenuName   = 0;
        wcex.lpszClassName  = szWindowClass;
        wcex.hIconSm        = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));

        return RegisterClassEx(&wcex);
    }

在这个函数中,我编写了GetLastError()来测试错误



    BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
    {
       HWND hWnd;

       hInst = hInstance; // Store instance handle in our global variable

       hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
          CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
       DWORD eNum = GetLastError( );
       if(eNum){
           ::MessageBox(hWnd, L"Error after creating windows", L"who cares",  MB_OK | MB_ICONINFORMATION);
       }
       if (!hWnd)
       {
          return FALSE;
       }

       ShowWindow(hWnd, nCmdShow);
       UpdateWindow(hWnd);

       return TRUE;
    }


    LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
        int wmId, wmEvent;
        PAINTSTRUCT ps;
        HDC hdc;

        switch (message)
        {
        case WM_COMMAND:
            wmId    = LOWORD(wParam);
            wmEvent = HIWORD(wParam);
            // Parse the menu selections:
            switch (wmId)
            {
            case IDM_ABOUT:
                DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
                break;
            case IDM_EXIT:
                DestroyWindow(hWnd);
                break;
            default:
                return DefWindowProc(hWnd, message, wParam, lParam);
            }
            break;
        case WM_PAINT:
            hdc = BeginPaint(hWnd, &ps);
            // TODO: Add any drawing code here...
            EndPaint(hWnd, &ps);
            break;
        case WM_DESTROY:
            PostQuitMessage(0);
            break;
        default:
            return DefWindowProc(hWnd, message, wParam, lParam);
        }
        return 0;
    }


    // Message handler for about box.
    INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
    {
        UNREFERENCED_PARAMETER(lParam);
        switch (message)
        {
        case WM_INITDIALOG:
            return (INT_PTR)TRUE;

        case WM_COMMAND:
            if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
            {
                EndDialog(hDlg, LOWORD(wParam));
                return (INT_PTR)TRUE;
            }
            break;
        }
        return (INT_PTR)FALSE;
    }

正如您所看到的几乎与向导生成的代码相同我只设置了wcex.lpszMenuName = 0并添加了一个带消息框的GetLastError。

1 个答案:

答案 0 :(得分:0)

我只是意识到如果以管理员身份运行vc修复