CD-Rom-Laufwerke produktnamen auslesen ?



  • Wenn ich z.b jetzt meinen Brenner nehmen:

    IDE\CdRomLITE-ON_LTR-24102B______________________5S5A____\5&2dfcc752&0&0.1.0

    Brauche ich den String so unterteilt.

    IDE
    CdRomLITE-ON_LTR-24102B______________________5S5A____
    5&2dfcc752&0&0.1.0

    Währe ja auch sonnst nich das Problem. Aber ich kann mir ja nich sicher sein das irgent ein Hersteller nich ein / im Namen hat den wenn das so währe dan bekomme ich eine Falsche ID nummer.



  • char* lastbs=strrchr(dw,'\');
    char* firstbs=strchr(dw,'\');
    *firstbs='\0';
    ++firstbs;
    *lastbs='\0';
    ++lastbs;

    cout<<dw<<endl;
    cout<<firstbs<<endl;
    cout<<lastbs<<endl;



  • So das geht unter XP aber ob es unter andren Windows Versionen Lauft kann ich nicht sagen.

    CRegKey key;
        DWORD dwValue;
        key.Open( HKEY_LOCAL_MACHINE,"SYSTEM\\CurrentControlSet\\Services\\Cdrom\\Enum", KEY_READ);
        key.QueryValue( dwValue, "Count");
        key.Close();
    
        int divce = dwValue;
        int index = 0;
    
        while(index <= divce-1 && index >= 0)
        {
            char sa[256];
            sprintf(sa, "%d",index);
    
            CRegKey key;
            char DW[256];
            DWORD dwCount0 = sizeof(DW);
            key.Open(HKEY_LOCAL_MACHINE,"SYSTEM\\CurrentControlSet\\Services\\Cdrom\\Enum", KEY_READ);
            key.QueryValue(DW, sa, &dwCount0);
            key.Close();
    
            char read[32] = "SYSTEM\\CurrentControlSet\\Enum\\";
            strcat(read, DW);
    
            char DW2[256];
            DWORD dwCount02 = sizeof(DW2);
            key.Open(HKEY_LOCAL_MACHINE,read, KEY_READ);
            key.QueryValue(DW2, "FriendlyName", &dwCount02);
            key.Close();
    
            CString Add = DW2;
            m_lw.AddString(Add);
    
            index++;
        }
    


  • Wenn man absichern will das bei Scsi Laufwerken oder Virtualen Laufwerken das SCSI CdRom Device dahinter steht. Haut das hier noch in die Schleife.

    CString Add = DW2;
            Add.Replace(" SCSI CdRom Device","");
            m_lw.AddString(Add);
    


  • Wär das nichts für die FAQ ??



  • Auch ich habe alles mögliche unte Win98SE/ME versucht, um dieses Problem in den Griff zu kriegen.
    Allerdings auch erfolglos.
    Das kann doch nicht sein, daß die MFC keine Methode dazu zur Verfügung stellt ????
    Vielleicht sollte man diesen Beitrag auch in der API-Section posten ????

    Ich mach das mal...



  • Mich würde auch interessieren, ob es eine möglichkeit gibt, das ganze unter Windwos 98 zu machen ????



  • 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