Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 调用RegisterClassEX时忽略WNDCLASSEX的HINSTANCE成员?_Windows_Winapi - Fatal编程技术网

Windows 调用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

注册窗口类时,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 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作为类样式)。