【发布时间】:2012-01-22 22:54:31
【问题描述】:
我正在尝试使用原生 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]”。最令人困惑的部分是错误消息打印到控制台:
哦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(或至少不是代码本身)。我将代码复制到另一个项目,它工作。
【问题讨论】:
-
我想您是故意不将 Visual Studio 向导/模板用于教育目的?此外,
void main()不是有效的 C++。 -
是的,我想在开始使用向导之前大致了解如何使用本机 Windows 消息队列系统。我的 main() 函数的 void 返回类型应该与 CreateWindowEx() 函数无关,即使它不应该是有效的。
-
我并不是说你应该在不理解向导代码的情况下使用它! :-) 只是这些样板文件很难理解,而 也 没有尝试正确输入所有内容。
-
@Joshua:为了学得好,你需要停止使用阻碍学习的技术。
void main就是其中之一。从绝对意义上讲,它并没有那么糟糕(它只是阻止代码使用 g++ 和其他编译器进行编译),但它是 Microsoft 锁定编码模式的接受,当您接受其中任何一个时,你可能会接受更多,等等,那些编码模式真的很糟糕(例如,向导中的错误处理为窗口生成的代码,不工作)。特别是,停止使用那些 C casts。立刻。他们隐藏错误。干杯&hth., -
@CodyGray,您说的是哪个现代版本的 Windows? Windows 7 至少仍然支持非 Unicode 应用程序...如果一半正在使用的应用程序停止工作,一切都会崩溃。
标签: c++ c winapi visual-c++ user-interface