2015-05-13 35 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

非常感谢。我会尝试改变我的方法,我绝对不希望我的应用在未来崩溃。 –