CD-Rom-Laufwerke produktnamen auslesen ?



  • bei mir (win xp) liegt da unter HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Cdrom\Enum lauter so kram rum. da scheint zu stehen, welche cdroms an sind.
    und details dazu dann unter HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\IDE und dem entsprechenden namen.



  • Ich habe das unter Xp mal in einer schleife versucht aber ich bekomme nur 2 mal die selben zahelen zurück.

    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();
    
            CString add;
            add.Format("%dx",DW);
            m_lw.AddString(add);
    
            index++;
        }
    


  • ich schreibs mal um in ein konsolen-prog und teste.



  • mir scheint, das klappt. kann nicht genauer testen, hab nur ein cdr-laufwerk.

    #include <afxwin.h>
    #include <atlbase.h>
    #include <iostream>
    using namespace std;
    
    int main()
    {
        DWORD enumCount;
    
        CRegKey key;
        key.Open( HKEY_LOCAL_MACHINE,"SYSTEM\\CurrentControlSet\\Services\\Cdrom\\Enum", KEY_READ);
        key.QueryValue(enumCount,"Count");
        key.Close();
    
        for(int index=0;index<enumCount;++index)
        {
            char sa[20];
            sprintf(sa,"%d",index);
            char dw[256];
    
            DWORD dwCount=sizeof(dw);
            key.Open(HKEY_LOCAL_MACHINE,"SYSTEM\\CurrentControlSet\\Services\\Cdrom\\Enum", KEY_READ);
            key.QueryValue(dw, sa, &dwCount);
            key.Close();
    
            cout<<dw<<endl;
        } 
        return 0;
    }
    


  • aber ich glaub das klappt nur ab Windows 2000, also nicht auf 95 und 98



  • Es geht mit alle Laufwerken unter Win Xp:

    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);
    
            MessageBox(sa);
    
            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();
    
            CString Add=DW;
            m_lw.AddString(Add);
    
            index++;
        }
    

    Nur darf man die so schön Formatieren 😃



  • schau mal meine for-schleife an und vergleich die mit deiner while-schleife.
    irgendwie gefällt mir for da besser.



  • Wenn mir einer Sag wie ich von Links anfange zu suchen dan könnte ich den Namen Super ohne Formatierung raus bekommen (jeden falls unter XP).



  • Original erstellt von <D>:
    Wenn mir einer Sag wie ich von Links anfange zu suchen dan könnte ich den Namen Super ohne Formatierung raus bekommen (jeden falls unter XP).

    konkret? was soll wo gesucht werden?

    hier code, der beim ersten unterstrich rechts abschnippelt:

    char* bs=strchr(dw,'_');
    if(bs) *bs='\0';

    und hier code, der die ersten 10 zeichen links abschnippelt:

    dw+=10;

    und hier code, der alles links vom ersten \ abschnippelt:

    char* bs=strchr(dw,'\');
    if(bs) dw=bs+1;

    [ Dieser Beitrag wurde am 22.01.2003 um 23:56 Uhr von volkard editiert. ]



  • Das is jetzt erstmal egal.Mir geht es jetzt erst mal um die lösung de Problems.Dann kommen die feinheiten.

    Weil ich raume die Sache jetzt so auf:

    Auslesen des Ports (Die Buchstaben vor den ersten /)
    Auslesen der IDnummer (das sind die Zahlen hinter dem "2." /)

    Wenn ich diese beiden Werte haben kann ich ganz leicht die Richtigen Windows Namen auslesen.Nur leider kann ich ja nich davon aus gehen das es wirklick nur 2 / giebt. Das erste is kalr aber das 2. / würd ja zu such nach der ID benötigt.



  • 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


Anmelden zum Antworten