2015-05-13 2 views
2

я узнал, что в строгом режиме Windows, ручки, как HBRUSH, определяются как структуры, чтобы избежать глупых ошибок и мне было интересно, если делать что-то вроде следующего безопасен:Можно ли расширить структуру API Windows?

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

Никогда не предполагайте, что что-то в порядке, потому что не возникает никакой ошибки. Неопределенное поведение не определено; действительная реализация undefined - это работа для вас и всех ваших коллег и взорвающаяся на лице вашего самого важного клиента. –

ответ

0

Это должно быть безопасным; это не отличается от того, что произойдет, если у вас есть:

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

Это говорит, ИМХО это быть хитрым ради того, чтобы быть хитрыми и нечлен функция void GetRGB(HBRUSH h, BYTE* result) будет понятнее и более устойчив к разрыву с будущими версиями SDK. a.GetRGB(b) не намного яснее, чем GetRGB(a, b).

Если вы решили сделать это убедиться, что вы добавляете static_assert так, что если кто-то позже пытается добавить переменную-член или что-то, что он не может скомпилировать)

+0

Большое спасибо. Я попытаюсь изменить свои методы, я определенно не хочу, чтобы мое приложение распалось в будущем. –

Смежные вопросы