2013-11-15 34 views
0

註冊窗口類時,RegisterClassEx()(http://msdn.microsoft.com/en-us/library/windows/desktop/ms633587(v=vs.85).aspx)是否忽略WNDCLASSEX結構的HINSTANCE成員中指定的值?呼叫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的值都不相同,這表明它們被忽略。

任何人都可以確認它被忽略?

+2

1和2不是有效的實例句柄。您因此調用未定義的行爲。未定義的行爲可能導致任何事情。返回奇怪的錯誤算作「任何事情」。 –

+0

hInstance成員應該標識包含窗口過程的模塊,因此即使RegisterClassEx未使用此值,我也確信Windows在將消息發送到窗口過程時將使用此值。 – Stuart

+0

您正在嘗試註冊名稱相同的兩個班級,所以我不驚訝第二次通話失敗。 – Stuart

回答

0

RegisterClassEx函數不會簡單地忽略WNDCLASSEX結構的hInstance成員中指定的值。但是,如果在WNDCLASSEX結構的hInstance成員中傳遞了無效值,則RegisterClassEx函數會返回意外的結果。