gpt4 book ai didi

c++ - CreateWindowEx 函数失败但 GetLastError() 返回 ERROR_SUCCESS

转载 作者:IT王子 更新时间:2023-10-28 23:27:56 40 4
gpt4 key购买 nike

我正在尝试使用原生 Windows 消息队列系统(不带 .NET)使用 C/C++ 创建一个简单的窗口。我按照 MSDN 教程编写了一些创建空窗口的基本代码:

void main()
{
HINSTANCE hinst;
HWND hwndMain;
WNDCLASSEX wnd;
MSG msg;

hinst = GetModuleHandle( NULL );
memset( &wnd, 0, sizeof( wnd ) );
wnd.cbSize = sizeof( wnd );
wnd.lpszClassName = "MainWClass";
wnd.lpfnWndProc = MainWProc;
wnd.hInstance = hinst;
int result = RegisterClassEx( &wnd );
if( !result )
{
printf("RegisterClassEx error: %d\r\n", GetLastError() );
}

hwndMain = CreateWindowEx
(
0, //extended styles
wnd.lpszClassName, //class name
"Main Window", //window name
WS_OVERLAPPEDWINDOW | WS_HSCROLL | WS_VSCROLL | WS_MINIMIZEBOX, //style tags
CW_USEDEFAULT, //horizontal position
CW_USEDEFAULT, //vertical position
CW_USEDEFAULT, //width
CW_USEDEFAULT, //height
(HWND) NULL, //parent window
(HMENU) NULL, //class menu
(HINSTANCE) wnd.hInstance, //some HINSTANCE pointer
NULL //Create Window Data?
);

if( !hwndMain )
{
printf("Oh shi- %d\n", GetLastError() );
}
ShowWindow( hwndMain, SW_SHOWDEFAULT );
UpdateWindow( hwndMain );
}

当我运行/调试程序时,CreateWindowEx 返回 0,这意味着它失败了。这会触发错误消息“Oh shi- [error code]”。最令人困惑的部分是错误消息打印到控制台:

Oh shi- 0

GetLastError()返回的错误码为0,即ERROR_SUCCESS!

我完全不知所措;怎么了?我好纠结……

附:我在 Windows 7 32 位上使用 Visual C++ Express 2010。我在其他地方编写了一个 Windows 过程,但它只是在所有情况下都返回 0。但是,如果有人想看它,我会很乐意展示它。

我已将我的 Visual C++ 项目的项目默认字符集更改为“未设置”。我不需要在我的东西前面加上 L。

编辑:添加 wnd.hInstance = hinst;

编辑:删除了不必要的 (WNDPROC) 类型转换

编辑:为 RegisterClassEx 添加错误检查

原来问题出在 Visual C++ Express(或至少不是代码本身)。我将代码复制到另一个项目,它工作。

最佳答案

wnd.lpfnWndProc = (WNDPROC) MainWProc;

我们看不出你需要使用类型转换的真正原因,但它很可疑。如果没有发现任何问题,Windows 从 GetLastError() 返回 0。如果窗口过程被破坏,就会发生这种情况。喜欢这个:

LRESULT CALLBACK MainWProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
return 0;
}

Windows 发送 WM_NCCREATE 消息来请求创建窗口。如果该消息没有得到处理,那么将没有窗口。并且没有错误。修复:

LRESULT CALLBACK MainWProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
return DefWindowProc(hWnd, uMsg, wParam, lParam);
}

根据需要进行调整以自定义窗口。只需确保为您不想自己处理的每条消息调用 DefWindowProc() 即可。并保持 Petzold 近在咫尺,以避免简单的错误。并失去 Actor 阵容。

关于c++ - CreateWindowEx 函数失败但 GetLastError() 返回 ERROR_SUCCESS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8550679/

40 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com