扩展 Windows API 结构安全吗?
Is it safe to extend a Windows API structure?
我了解到在严格模式下 Windows 句柄,如 HBRUSH,被定义为一个结构以避免愚蠢的错误,我想知道像下面这样的事情是否安全:
class WINBRUSH : public HBRUSH
现在我对 C++ 不是很精通,但这似乎是一个非常糟糕的主意。我在想的是,如果我不向 class 添加任何内容,那么 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);
}
};
现在我已经测试了上面的 class 并检查了我是否从 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);
}
应该是安全的;这与以下情况没有什么不同:
struct X
{
HBRUSH abc;
GetRGB(/* ... */) {}
}
也就是说,恕我直言,这是为了棘手而棘手,非成员函数 void GetRGB(HBRUSH h, BYTE* result)
会更清晰,更能抵抗 SDK 未来版本的破坏。 a.GetRGB(b)
并不比 GetRGB(a, b)
.
清楚得多
如果您决定这样做,请确保添加一个 static_assert
,这样如果有人稍后尝试添加一个成员变量或无法编译的东西)
我了解到在严格模式下 Windows 句柄,如 HBRUSH,被定义为一个结构以避免愚蠢的错误,我想知道像下面这样的事情是否安全:
class WINBRUSH : public HBRUSH
现在我对 C++ 不是很精通,但这似乎是一个非常糟糕的主意。我在想的是,如果我不向 class 添加任何内容,那么 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);
}
};
现在我已经测试了上面的 class 并检查了我是否从 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);
}
应该是安全的;这与以下情况没有什么不同:
struct X
{
HBRUSH abc;
GetRGB(/* ... */) {}
}
也就是说,恕我直言,这是为了棘手而棘手,非成员函数 void GetRGB(HBRUSH h, BYTE* result)
会更清晰,更能抵抗 SDK 未来版本的破坏。 a.GetRGB(b)
并不比 GetRGB(a, b)
.
如果您决定这样做,请确保添加一个 static_assert
,这样如果有人稍后尝试添加一个成员变量或无法编译的东西)