今日免费次数已满, 请开通会员/明日再来

3

我应用程序中调用 RegisterClassEx 失败了,错误代码是87,“参数不正确”。

memset( &m_wcx, 0, sizeof(WNDCLASSEX) );

m_wcx.cbSize = sizeof(WNDCLASSEX);  // size of structure
m_wcx.style = WS_ICONIC;            // initially minimized
m_wcx.lpfnWndProc = &WndProc;       // points to window procedure
m_wcx.cbClsExtra = 0;               // no extra class memory
m_wcx.cbWndExtra = 0;               // no extra window memory
m_wcx.hInstance = m_hInstance;      // handle to instance
m_wcx.hIcon = ::LoadIcon( NULL, IDI_APPLICATION ); // default app icon
m_wcx.hCursor = ::LoadCursor( NULL, IDC_ARROW ); // standard arrow cursor
m_wcx.hbrBackground = NULL;         // no background to paint
m_wcx.lpszMenuName = NULL;          // no menu resource
m_wcx.lpszClassName = _pwcWindowClass; // name of window class
m_wcx.hIconSm = NULL;               // search system resources for sm icon

m_atom = ::RegisterClassEx( &m_wcx );

if ( m_atom == 0 )
{
    TRACE(_T("CNotifyWindow::CNotifyWindow : Failed to register window class.\r\n\tError: %d\r\n\tFile: %s\r\n\tLine: %d\r\n"), ::GetLastError(), __WFILE__, __LINE__);
    THROW(::GetLastError());
}

有人知道我做错了什么吗?谢谢。


你能告诉我第87行是哪一行吗? - Ramilol
@Ramilol:几乎唯一可能的行就是调用RegisterClassEx。确实,OP说这是失败的那一行。 - John Dibling
@Ramilol,87是错误代码,而非行号。 - Frédéric Hamidi
顺便说一句,这不是问题的答案,但如果你正在编写一个独立的应用程序,你可以从GetModuleHandle(NULL)获取应用程序的HINSTANCE。(事实上,现在所有的WinMain参数都是垃圾,但如果你觉得必须到处传递,那么HINSTANCE是最让人恼火的一个。) - please delete me
我同意。你可以将其声明为全局变量。 - Ramilol
3个回答

3

然而,这可能不是实际问题,如果WS_ICONIC评估为一个有效的类样式。 - John Dibling
+1. 这似乎是传递了无效的标志。请查看 CS_* 标志,以获取样式参数。 - OJ.
@John,我检查了,WS_ICONIC0x20000000,远高于最高的类样式位(CS_DROPSHADOW0x20000)。 - Frédéric Hamidi

0

通常,“参数不正确”是WINAPI的说法,“伙计,你给我发了垃圾。”

因此,WNDCLASSEX成员变量之一可能是垃圾。首先,仔细查看最有可能包含不适当内容的变量:m_wcx.hInstancem_wcx.lpfnWndProcm_wcx.lpszClassName

编辑:

正如@Johann Gerell指出的那样,m_wcx.style = WS_ICONIC就是一个例子。文档中说这是类样式,但你却发送了窗口样式。不好。

什么是区别?你知道C++中的类和对象之间的区别吗?一个类就像一个蓝图,而一个对象则是该蓝图的实例化。窗口类和窗口也是如此。窗口类是创建窗口的蓝图,而窗口是该窗口类的实例化。窗口类具有指定诸如使用何种DC、何时进行垂直刷新等每个窗口类实例都适用的低级别样式。窗口也有样式,但这些样式不同。窗口样式指定每个窗口特定的属性,例如窗口是否可见、最小化等。因此,RegisterClassEx要求你提供橙子,而你却试图给它苹果。

0

第一件事是 WS_ICONIC。 窗口样式与窗口样式完全不同。 类样式是CS_*的样式。


详细说明一下(这个答案很干燥 :))- WS_ICONIC 是一个窗口样式。将其传递给 CreateWindow 和相关函数。在 WNDCLASSEX 中指定的样式是类样式(http://msdn.microsoft.com/en-us/library/ff729176(v=VS.85).aspx)。 - please delete me

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接