Definieren und Exportieren neuer GUIDs

Sie definieren eine neue GUID für ein Element, das der Treiber in andere Systemkomponenten, Treiber oder Anwendungen exportiert. Beispielsweise definieren Sie eine neue GUID für ein benutzerdefiniertes PnP-Ereignis auf einem seiner Geräte. Um eine neue GUID zu definieren und zu exportieren, müssen Sie die folgenden Schritte ausführen:

  1. Wählen Sie einen symbolischen Namen für die GUID aus.

    Wählen Sie einen Namen aus, der den Zweck der GUID darstellt. Das Betriebssystem verwendet beispielsweise Namen wie GUID_BUS_TYPE_PCI und PARPORT_WMI_ALLOCATE_FREE_COUNTS_GUID.

  2. Generieren Sie einen Wert für die GUID mit Uuidgen.exe oder Guidgen.exe. Wenn Sie die Microsoft Windows SDK installieren, wird Uuidgen.exe automatisch installiert.

    Diese Hilfsprogramme generieren eine eindeutige, formatierte Zeichenfolge, die einen 128-Bit-Wert darstellt. Der Schalter "-s" Uuidgen.exe gibt die GUID aus, die als C-Struktur formatiert ist.

  3. Definieren Sie die GUID in einer entsprechenden Headerdatei.

    Verwenden Sie das makro DEFINE_GUID (definiert in Guiddef.h), um den symbolischen GUID-Namen seinem Wert zuzuordnen (siehe Beispiel 1).

    Beispiel 1: Definieren von GUIDs in einer GUID-Only Headerdatei

    :
    
    DEFINE_GUID( GUID_BUS_TYPE_PCMCIA, 0x09343630L, 0xaf9f, 0x11d0, 
        0x92,0x9f, 0x00, 0xc0, 0x4f, 0xc3, 0x40, 0xb1 );
    DEFINE_GUID( GUID_BUS_TYPE_PCI, 0xc8ebdfb0L, 0xb510, 0x11d0, 
        0x80,0xE9, 0x00, 0x00, 0xf8, 0x1e, 0x1b, 0x30 );
    
    :
    

    Wenn die GUID in einer Headerdatei definiert ist, die andere Anweisungen als GUID-Definitionen enthält, müssen Sie einen zusätzlichen Schritt ausführen, um sicherzustellen, dass die GUID in Treibern instanziiert wird, die die Headerdatei enthalten. Die DEFINE_GUID-Anweisung muss außerhalb aller #ifdef-Anweisungen auftreten, die eine mehrfache Einbindung verhindern. Andernfalls wird die GUID nicht in Treibern instanziiert, die die Headerdatei verwenden, wenn die Headerdatei in einem vorkompilierten Header enthalten ist. Siehe Beispiel 2 für eine BEISPIEL-GUID-Definition in einer gemischten Headerdatei.

    Beispiel 2: Definieren von GUIDs in einer gemischten Headerdatei

    #ifndef _NTDDSER_    // this ex. is from a serial driver .h file
    #define _NTDDSER_
    
    :
    // Put other header file definitions here.
    :
    
    #endif  // _NTDDSER_
    
    #ifdef DEFINE_GUID   // Do not break compiles of drivers that 
                         // include this header but that do not
                         // want the GUIDs.
    //
    // Put GUID definitions outside of the multiple inclusion 
    // protection.
    
    DEFINE_GUID(GUID_CLASS_COMPORT, 0x86e0d1e0L, 0x8089, 0x11d0, 0x9c,
        0xe4, 0x08, 0x00, 0x3e, 0x30, 0x1f, 0x73);
    
    DEFINE_GUID (GUID_SERENUM_BUS_ENUMERATOR, 0x4D36E978, 0xE325, 
        0x11CE, 0xBF, 0xC1, 0x08, 0x00, 0x2B, 0xE1, 0x03, 0x18);
    
    :
    #endif  // DEFINE_GUID
    

    Das Platzieren einer GUID-Definition außerhalb von Anweisungen, die eine mehrfache Einbeziehung verhindern, führt nicht zu mehreren Instanzen der GUID in einem Treiber, da DEFINE_GUID die GUID als EXTERN_C Variable definiert. Mehrere Deklarationen einer EXTERN-Variablen sind zulässig, solange die Typen übereinstimmen.

  4. Beim Erstellen einer GUID für eine neue Geräteeinrichtungsklasse oder Geräteschnittstellenklasse gelten die folgenden Regeln:

    • Verwenden Sie keine einzige GUID, um sowohl eine Geräteeinrichtungsklasse als auch eine Geräteschnittstellenklasse zu identifizieren.

    • Verwenden Sie beim Erstellen eines symbolischen Namens, der der GUID zugeordnet werden soll, die folgende Konvention:

      Verwenden Sie für Gerätesetupklassen das Format GUID_DEVCLASS_XXX.

      Verwenden Sie für Geräteschnittstellenklassen das Format GUID_DEVINTERFACE_XXX.