2010-04-04 18 views
5

Czy istnieje sposób przesyłania dalej - deklarowanie typu HINSTANCE z poziomu interfejsu WinAPI bez uwzględnienia pełnego (i dużego) nagłówka windows.h?Przekaż dalej HINSTANCE i przyjaciele

Na przykład, jeśli mam klasy RenderWindow który jest właścicielem HINSTANCE mInstance, i będą musiały zawierać windows.h w RenderWindow.h. Zatem wszystko, co potrzebuje RenderWindow, musi również zawierać windows.h.

Próbowałem w tym windef.h, ale wydaje się to wymagać pewnych rzeczy od windows.h. :-(Jeśli nie mogę do przodu zadeklarować, czy istnieje przynajmniej przenośny sposób użyć czegoś podobnego w RenderWindowlong mInstance zamiast HINSTANCE?

+0

Czy włączenie windows.h faktycznie powoduje żadnych problemów? –

+1

Nie bezpośrednio, ale nie lubię go włączać, ponieważ trzeba czasami nie zdefiniować makr 'min' i' max' i myślę, że zwiększa czas kompilacji/wyszukiwania itp. – abenthy

+2

'#define NOMINMAX' przed dodaniem' '. –

Odpowiedz

4

HINSTANCE jest zadeklarowane w WinDef.h jako typedef HINSTANCE __ * HINSTANCE;

można napisać w nagłówkach:

#ifndef _WINDEF_ 
class HINSTANCE__; // Forward or never 
typedef HINSTANCE__* HINSTANCE; 
#endif 

Dostaniesz błędów kompilacji odwołujące się HINSTANCE gdy WinDef.h nie jest wliczony w cenę.

+2

To hack, którego szukałem, bardzo sprytny! ('' HINSTANCE__' wydaje się być 'struct' tutaj na MSVC2005) – abenthy

+1

To nie jest hack, Windef.h jest napisany, aby to umożliwić :-) Deklaracja klasy zamiast struct gwarantuje błąd kompilatora, jeśli Windef.h zostanie zawarty później, co oznacza zły projekt struktury plików. –

+1

Widzę, ale jeśli użyję klasy i otrzymam błąd kompilatora, jeśli później zawrzemy 'windows.h' w moim pliku implementacyjnym, w którym potrzebuję' windows.h'. Czy jest to zła struktura plików do użycia, które sugerujesz typedef w pliku nagłówkowym i zawiera 'windows.h' w odpowiednim pliku źródłowym? – abenthy

3

Można zadeklarować void * i rzucać błędy z dala. To jest blisko niekończąca się walka chociaż, prędzej czy później dostaniesz potknął się używać wstępnie skompilowana nagłówki, więc nie dbają o wielkości windows.h

stdafx.h.

#define WIN32_LEAN_AND_MEAN 
#include <windows.h> 
3

For example, if I have a class RenderWindow which owns an HINSTANCE mInstance , i will have to include windows.h in RenderWindow.h . So everything that needs RenderWindow also has to include windows.h .

Czy spojrzałeś na Pimpl idiom? Pozwala to ukryć prywatnych członków. Efektem ubocznym jest to, że nie musisz uwzględniać ich nagłówków w nagłówku klasy.

+0

Yup, Pimpl to sposób, w jaki zwykle to robię. – jalf

+0

Dzięki za sugestię. Nigdy nie muszę mówić, że wolę rozwiązanie Alaina Rista. – abenthy