扩展Windows API结构是否安全?

时间:2015-05-13 03:02:41

标签: c++ winapi

我了解到在严格模式下,Windows Handles(如HBRUSH)被定义为一个结构,以避免愚蠢的错误,我想知道如果做以下事情是安全的:

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);
}

1 个答案:

答案 0 :(得分:0)

应该是安全的;它与你遇到的情况没有什么不同:

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

那就是说,恕我直言,这是一件非常棘手的事情,而且非成员函数void GetRGB(HBRUSH h, BYTE* result)会更清晰,更能抵抗未来版本的SDK的破坏。 a.GetRGB(b)并不比GetRGB(a, b)明显更清晰。

如果您决定这样做,请确保添加static_assert,以便以后有人尝试添加成员变量或无法编译的内容时