Windows 调用RegisterClassEX时忽略WNDCLASSEX的HINSTANCE成员?
注册窗口类时,RegisterClassEx()是否只是忽略WNDCLASSEX结构的HINSTANCE成员中指定的值Windows 调用RegisterClassEX时忽略WNDCLASSEX的HINSTANCE成员?,windows,winapi,Windows,Winapi,注册窗口类时,RegisterClassEx()是否只是忽略WNDCLASSEX结构的HINSTANCE成员中指定的值 ATOM one = registerClass((HINSTANCE)1, (WNDPROC)0); ATOM two = registerClass((HINSTANCE)2, (WNDPROC)0); return 0; ATOM registerClass(HINSTANCE hInstance, WNDPROC wndProc){ WNDCLASSEX w
ATOM one = registerClass((HINSTANCE)1, (WNDPROC)0);
ATOM two = registerClass((HINSTANCE)2, (WNDPROC)0);
return 0;
ATOM registerClass(HINSTANCE hInstance, WNDPROC wndProc){
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 = NULL;
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName = NULL; //MAKEINTRESOURCE(IDC_FRAMEWORK);
wcex.lpszClassName = TEXT("Fag");
wcex.hIconSm = NULL;
return RegisterClassEx(&wcex);
}
在上面的代码中,对registerClass()的第二次调用会导致一个错误,错误代码是该类已经注册,即在第一次调用中
但在这两种情况下传递给HINSTANCE的值不同,表明它们被忽略了
有人能确认它被忽略了吗?RegisterClassEx函数不会简单地忽略WNDCLASSEX结构的hInstance成员中指定的值。但是,如果在WNDCLASSEX结构的hInstance成员中传递了无效值,则RegisterClassEx函数将返回意外结果。1和2不是有效的实例句柄。因此,您正在调用未定义的行为。未定义的行为可能导致任何结果。返回奇怪的错误被视为“任何”。hInstance成员应该标识包含窗口过程的模块,因此即使RegisterClassEx没有使用此值,我很确定Windows在向Windows过程发送消息时会使用此值。您正在尝试用相同的名称注册这两个类,因此第二次调用失败并不奇怪。更新:该代码是exe中的代码,用于模拟dll和同名exe对类的注册。1表示exe文件的状态。2表示dll的HMODULE。我研究了如何制作dll,并在代码中使用了有效值。一旦我这样做了,代码就按照我想要的方式工作,并试图进行模拟。我在Raymond的博客上读到了关于HINSTANCE的文章,以及它在调用RegisterWindow和CreateWindow时的使用。我认为系统不会特别关心这些值是有效的还是无效的。哦,我现在明白了(有点)。这篇MSDN文章可能会有所帮助。特别是关于应用程序本地类的部分和关于实例句柄的部分。当然,您正在注册的类是应用程序本地类(因为您没有使用CS_GLOBALCLASS作为类样式)。