CD-Rom-Laufwerke produktnamen auslesen ?



  • Ein sehr interessanter Thread !
    Auch ich würde das benötigen, allerdings habe ich auch bisher erfolglos unter Windows ME eine Lösung gesucht.

    @MysticEmpires

    Hochachtung ! Ich hoffe du schaffst das !



  • Unter win 98 sind alle Laufwerke Festplatten und CDRom unter HLM/enum/SCSI

    Jedes Laufwerk hat einen eigenen Schlüssel
    bei mir z.B. für CDROM "LG______CD-ROM_CRD-8482B1"
    in dem gibt es einen weiteren Schlüßen mit weiteren informationen

    Ich werde morgen mal schauen ob dazu noch weiteres herausfinde



  • Mal ganz was anderes ganz in API und ganz ohne Registry:

    #include <windows.h>
    #include <winioctl.h>
    #include <setupapi.h>
    
    BOOL EnumCDROM(HWND hWndParent)
    {
      PSP_DEVICE_INTERFACE_DETAIL_DATA pspdidd;
      SP_DEVICE_INTERFACE_DATA         spdid;
      SP_DEVINFO_DATA                  spdd;
      HDEVINFO                         hDevInfo;
      DWORD                            dwIndex, dwSize, dwType;
      TCHAR                            szMessage[1024], szProperty[256];
    
        ZeroMemory((PVOID)&spdid, sizeof(spdid));
        spdid.cbSize = sizeof(spdid);
    
        if(INVALID_HANDLE_VALUE == (hDevInfo = SetupDiGetClassDevs(&GUID_DEVINTERFACE_CDROM, NULL, NULL, DIGCF_DEVICEINTERFACE | DIGCF_PRESENT)))
        {
            wsprintf(szMessage, TEXT("SetupDiGetClassDevs failed, Error %u"), GetLastError());
            MessageBox(hWndParent, szMessage, NULL, MB_OK);
            return(FALSE);
        }
    
        for(dwIndex = 0; (SetupDiEnumDeviceInterfaces(hDevInfo, NULL, &GUID_DEVINTERFACE_CDROM, dwIndex, &spdid)); ++dwIndex)
        {
            dwSize = 0;
            SetupDiGetDeviceInterfaceDetail(hDevInfo, &spdid, NULL, 0, &dwSize, NULL);
    
            if(dwSize)
            {
                if(NULL == (pspdidd = (PSP_DEVICE_INTERFACE_DETAIL_DATA)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, dwSize)))
                    continue;
    
                pspdidd->cbSize = sizeof(*pspdidd);
    
                ZeroMemory((PVOID)&spdd, sizeof(spdd));
                spdd.cbSize = sizeof(spdd);
    
                if(SetupDiGetDeviceInterfaceDetail(hDevInfo, &spdid, pspdidd, dwSize, &dwSize, &spdd))
                {
                    if(SetupDiGetDeviceRegistryProperty(hDevInfo, &spdd, SPDRP_FRIENDLYNAME, &dwType, (PBYTE)szProperty, sizeof(szProperty), NULL))
                    {
                        if(dwType == REG_SZ)
                        {
                            wsprintf(szMessage, TEXT("FriendlyName: %s"), szProperty);
                            MessageBox(hWndParent, szMessage, NULL, MB_OK | MB_ICONINFORMATION);
                        }
                    }
                }
    
                HeapFree(GetProcessHeap(), 0, (PVOID)pspdidd);
            }
        }
    
        SetupDiDestroyDeviceInfoList(hDevInfo);
        return(TRUE);
    }
    

    Ab Windows 98/2000, nicht unter 95/NT4



  • Hey danke, das funktioniert ganz toll !!!!!



  • So was habe ich auch schon gesucht.
    Es wäre geil, wenn auch der Laufwerksbuchstabe angezeigt würde !



  • Ich habe den Code von -KING- auf WIN98SE mit VC6.0 ausführen wollen, und bekomme
    folgende Compiler - Fehlermeldung:

    error C2065: 'GUID_DEVINTERFACE_CDROM' : undeclared identifier

    Ich suchte vergeblich in der MSDN nach 'GUID_DEVINTERFACE_CDROM'



  • Du solltest Dein PSDK updaten. Vorab sollte aber das hier helfen:

    #include <initguid.h>
    
    DEFINE_GUID(GUID_DEVINTERFACE_CDROM,
        0x53f56308, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b);
    


  • Hi Leute !

    Habe den Code so wie angegeben versucht.
    Ich bekomme jetzt folgenden Fehler

    error C2664: 'SetupDiGetClassDevsA' : Konvertierung des Parameters 1 von 'const struct _GUID *' in 'struct _GUID *' nicht moeglich



  • Und nochmals: Ich sollt Euer PSDK updaten. In den alten originalen Header fehlt eben das CONST im Prototypen. Also bitte mal <setupapi.h> öffnen, nach eben dem Prototypen suchen und diesen dann in die richtige Form bringen. Wenn Du fertig bist, muß das im Header so aussehen:

    WINSETUPAPI
    HDEVINFO
    WINAPI
    SetupDiGetClassDevsA(
        IN CONST GUID *ClassGuid,  OPTIONAL
        IN PCSTR       Enumerator, OPTIONAL
        IN HWND        hwndParent, OPTIONAL
        IN DWORD       Flags
        );
    
    WINSETUPAPI
    HDEVINFO
    WINAPI
    SetupDiGetClassDevsW(
        IN CONST GUID *ClassGuid,  OPTIONAL
        IN PCWSTR      Enumerator, OPTIONAL
        IN HWND        hwndParent, OPTIONAL
        IN DWORD       Flags
        );
    
    #ifdef UNICODE
    #define SetupDiGetClassDevs SetupDiGetClassDevsW
    #else
    #define SetupDiGetClassDevs SetupDiGetClassDevsA
    #endif
    

Anmelden zum Antworten