#define DECLARE_HANDLE(name) ...



  • Hi Leute,
    ich bin gerade dabei den vom ClassWizard erzeugten Code (VC++ 6.0, dialogbasierte Anwendung) genauer unter die Lupe zu nehmen. In der Header-Datei meiner von CDialog abgeleiteten Klasse stolpere ich nun über folgende Deklaration:
    HICON m_hIcon;
    Bei der Suche nach dem eigentlichen Datentyp von HICON finde ich in der
    windef.h :
    DECLARE_HANDLE(HICON);

    In der winnt.h finde ich Folgendes:

    typedef void *PVOID;

    #ifdef STRICT
    typedef void *HANDLE;
    #define DECLARE_HANDLE(name) struct name##__ { int unused; }; typedef struct name##__ *name
    #else
    typedef PVOID HANDLE;
    #define DECLARE_HANDLE(name) typedef HANDLE name
    #endif
    typedef HANDLE *PHANDLE;

    Und in der (in afxv_w32.h) ist STRICT definiert (weist den Compiler an, total pingelig zu sein):

    #ifndef STRICT
    #define STRICT 1
    #endif

    Also, im else-Zweig werden alle HICON-Variablen zum Typ void * 🙂
    Aber wenn mir mal jemand die #define-Anweisung im if-Zweig erklären könnte 😕

    Also erst schon Mal Danke fürs Lesen.

    Wäre toll, wenn jemand was wüsste ...



  • Nunja, da bei PVOID keine Typüberprüfung gemacht werden kann, muss man sich was anderes ausdenken, um 'total pingelig' sein zu können. Daher wird eine interne Struktur angelegt, die nach aussen nicht sichtbar ist, dem Compiler aber die Möglichkeit gibt, Fehler wie HBITMAP hBmp = (HICON)hIcon als Konvertierungsfehler ausgeben zu können.



  • Hallo RenèG,

    du sagst: "dem Compiler aber die Möglichkeit gibt, Fehler wie HBITMAP hBmp = (HICON)hIcon als Konvertierungsfehler ausgeben zu können."

    Das kriege ich irgendwie nicht auf die Reihe, könntes du das mal etwas genauer erklären?

    Vielen Dank ...



  • HICON ist ein Icon, HBITMAP ist ein Bitmap, im Hintergrund aber sind beides 'NUR' Handles

    Würde man schreiben: Handle1 = Handle2, obwohl Handle1 ein Icon und Handle2 ein Bitmap ist, würde der Compiler es nicht anmeckern. Das soll verhindert werden



  • Danke, RenéG,

    ich hab's begriffen 😃


Anmelden zum Antworten