2015-05-13 61 views
2

我瞭解到,在嚴格模式Windows處理,像HBRUSH,被定義爲一個結構,以避免愚蠢的錯誤,我想知道,如果做這樣的事情,以下是安全的:擴展Windows API結構安全嗎?

class WINBRUSH : public HBRUSH 

現在,我不是很精通在C++中,但它似乎是一個非常糟糕的主意。我在想的是因爲如果我不向課堂添加任何東西,Windows就會分配這些對象,所以我應該沒問題。一個例子是:

class WINBRUSH : public HBRUSH__ 
{ 
public: 
    void GetRGB(BYTE* RgbArray) 
    { 
     LOGBRUSH LogBrush; 
     GetObject(this,sizeof(LOGBRUSH),&LogBrush); 
     RgbArray[0] = GetRValue(LogBrush.lbColor); 
     RgbArray[1] = GetGValue(LogBrush.lbColor); 
     RgbArray[2] = GetBValue(LogBrush.lbColor); 
    } 
}; 

現在我已經測試了上面的類和檢查,看看是否我從的getRGB方法得到了正確的價值觀和它的工作,但我只是想在此方面的投入。在此先感謝,達蒙。

測試代碼:

WINBRUSH* Brush = (WINBRUSH*)CreateSolidBrush(RGB(1,2,3)); 

BYTE Rgb[3]; 
Brush->GetRGB(Rgb); 

if((Rgb[0] == 1) && (Rgb[1] == 2) && (Rgb[2] == 3)) 
{ 
    MessageBox(NULL, L"RGB values are correct!", L"Success!", MB_OK); 
} 
+2

'static_assert(的sizeof(WINBRUSH)==的sizeof( HBRUSH))' –

+0

謝謝,我測試了上面的代碼,並沒有產生任何錯誤,所以我會認爲這意味着它的確定。 –

+1

永遠不要以爲沒有錯誤產生就認爲某些事情是好的。未定義的行爲是未定義的;未定義的有效實施適用於您和您的所有同事,並在最重要的客戶面前爆發。 –

回答

0

它應該是安全的;它沒有比發生了什麼不同,如果您有:

struct X 
{ 
    HBRUSH abc; 
    GetRGB(/* ... */) {} 
} 

這就是說,恕我直言,這是對被刁鑽的緣故是棘手的,和非成員函數void GetRGB(HBRUSH h, BYTE* result)會更清晰,更耐破損與未來版本SDK。 a.GetRGB(b)不比GetRGB(a, b)明顯更清楚。

如果你決定這樣做,確保你添加一個static_assert因此,如果後來有人嘗試添加一個成員變量或東西,它無法編譯)

+0

非常感謝。我會嘗試改變我的方法,我絕對不希望我的應用在未來崩潰。 –