-1

在调用 CreateWindowEx(..) 之前没有任何错误。并且 CreateWindowEx 不返回 NULL。有趣的是,在调用 ShowWindow 后会显示窗口。

如您所见,在代码中有 2 个写入错误代码的消息框。第一个写 126,另一个写 0。

(错误 126 表示:ERROR_MOD_NOT_FOUND 126 (0x7E) 找不到指定的模块。)

创建窗口后,窗口无法正常工作,如您在图像中看到的那样,如果我的指针在创建窗口的区域中处于加载位置等位置,当我将鼠标光标移动到窗口中时,它不会t 显示箭头,但显示调整大小光标。

对不起我的英语并感谢您的帮助。

代码:WinDeneme.cpp

    // WinDeneme.cpp : Defines the entry point for the application.
//

#include "stdafx.h"

const wchar_t *AppName = L"Example";
unsigned int ClassID=0;
wchar_t Error[100];

LRESULT CALLBACK Proc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);

int APIENTRY _tWinMain(_In_ HINSTANCE hInstance,
                     _In_opt_ HINSTANCE hPrevInstance,
                     _In_ LPTSTR    lpCmdLine,
                     _In_ int       nCmdShow)
{
    wchar_t *ClassName = (wchar_t*)malloc(sizeof(wchar_t) * 100);

    swprintf(ClassName,100,L"%s_%d",AppName,ClassID);
    ClassID++;

    WNDCLASS *Class = (WNDCLASS*)calloc(1,sizeof(WNDCLASS));

    Class->lpszClassName = ClassName;
    Class->hInstance = hInstance;
    Class->lpfnWndProc = (WNDPROC)Proc;

    RegisterClass(Class);

    HWND Win = CreateWindowEx(
        0,                              // Optional window styles.
        ClassName,                     // Window class
        AppName,    // Window text
        WS_OVERLAPPEDWINDOW,            // Window style

        // Size and position
        CW_USEDEFAULT, CW_USEDEFAULT, 200, 200,

        NULL,       // Parent window    
        NULL,       // Menu
        hInstance,  // Instance handle
        NULL        // Additional application data
        );

    swprintf(Error,100,L"%d",GetLastError());
    MessageBox(0,Error,L"Error",MB_OK); //  126

    ShowWindow(Win,nCmdShow);

    swprintf(Error,100,L"%d",GetLastError());
    MessageBox(0,Error,L"Error",MB_OK); //  0

    MSG msg = { };
    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }


    return EXIT_SUCCESS;
}

LRESULT CALLBACK Proc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch (uMsg)
    {
    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;

    case WM_PAINT:
        {
            PAINTSTRUCT ps;
            HDC hdc = BeginPaint(hwnd, &ps);

            FillRect(hdc, &ps.rcPaint, (HBRUSH) (COLOR_WINDOW+1));

            EndPaint(hwnd, &ps);
        }
        return 0;

    }
    return DefWindowProc(hwnd, uMsg, wParam, lParam);
}

标准数据文件

#include <windows.h>
#include <stdlib.h>
#include <stdio.h>
#include <memory.h>
#include <tchar.h>

图像(我使用我的相机,因为光标不会出现在打印屏幕上):

指针处于加载位置

指针处于调整大小位置

**编辑:我通过添加解决了指针问题

Class->hCursor = LoadCursor(NULL, IDC_ARROW);

但我仍然在 VS2012 Express 中收到错误 126。

4

2 回答 2

1

GetLastError()仅在发生实际错误时才有意义,除非另有说明。

在 的情况下CreateWindow/Ex(),如果它返回一个非 NULL 句柄,则没有发生错误,并且 的值GetLastError()未定义的(它仍然包含来自早期 API 函数调用的错误代码)。

您必须GetLastError()在 API 函数退出后和任何其他 API 函数被调用之前立即调用,并且在 API 函数失败并出现错误时调用,除非 API 函数被明确记录为GetLastError()在其他情况下返回有效值(例如,当CreateMutex()返回一个非 NULL 句柄,如果互斥体已经存在则GetLastError()返回ERROR_ALREADY_EXISTS,否则返回 0)。

大多数 API 函数在执行其工作之前不会重置GetLastError(),因此保留了较早的错误代码。如果没有发生错误,只有GetLastError()用于报告成功扩展信息的 API 函数才会重置。GetLastError()

于 2013-07-17T20:21:27.087 回答
0

如果CreateWindow返回一个非 NULL 值,它不会失败。没有错误,所以不需要调用GetLastError.

于 2013-07-17T11:07:24.063 回答