扩展Windows API结构是安全的吗?

Is it safe to extend a Windows API structure?

本文关键字:安全 Windows API 结构 扩展      更新时间:2023-10-16

我了解到,在严格的模式下,窗口(例如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方法中获得了正确的值,但我只是想对此进行一些输入。预先感谢Damon。

测试代码:

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

应该是安全的;这与如果有:

会发生什么。
struct X
{
    HBRUSH abc;
    GetRGB(/* ... */) {}
}

也就是说,恕我直言,这很棘手,这是棘手的,而非成员函数void GetRGB(HBRUSH h, BYTE* result)将更加清晰,并且更耐心地使用SDK的未来版本。a.GetRGB(b)不比GetRGB(a, b)更清楚。

如果您确实决定执行此操作,请确保添加static_assert,以便以后有人尝试添加成员变量或无法编译的内容)