Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Опредеоения жестких дисков


Автор: Zorak 18.1.2009, 13:01
Вот написал код, которий по идее должен определять все диски в компютере, тоесть флопик, РОМ, флешки + жесткие диски... так как РОМ у меня отключений, то роботоспособность кода проверить не могу.. но вот при включених флешках и естессно наявности жестких дисков програма не работает((( Не знаю почему.. ошибок нету.. но и не работает....... целую програму я виложу в архиве.... в посте коротко напишу код, которий ищет ети диски....
Код

BOOL DlgOnInitDialog(HWND hWnd,HWND,LPARAM)
{
    DWORD dwSize = GetLogicalDriveStrings(0,NULL);
    HANDLE hHeap = GetProcessHeap();
    LPSTR szDrivers = (LPSTR)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,dwSize);
    GetLogicalDriveStrings(dwSize,szDrivers);
    LPSTR szNext = szDrivers;
    while(szNext[0]!=0)
    {
        SendDlgItemMessage(hWnd,ID_COMBO,CB_ADDSTRING,0,(LPARAM)szNext);
        szNext = strchr(szNext,0)+1;
    }
    HeapFree(hHeap,0,szDrivers);

    return TRUE;
}

void FillInfo(HWND hWnd, LPSTR szVol)
{
    char szText[80];
    int nDriverType = GetDriveType(szVol);

    switch (nDriverType)
    {
        case DRIVE_REMOVABLE:strcpy(szText,"Ñåìíèé äèñê");
            break;
        case DRIVE_FIXED: strcpy(szText,"Æåñòêèé äèñê");
            break;
        case DRIVE_CDROM: strcpy(szText,"ÑÄ-Äèñê");
            break;
    }
    SetWindowText(GetDlgItem(hWnd,ID_DRIVERTYPE),szText);

Подскажите кто знает что тут не так ....
заранее спасибо

Автор: 586 19.1.2009, 00:35
Код
BOOL CALLBACK DlgProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
    switch(msg)
    {
        HANDLE_MSG(hWnd,WM_INITDIALOG,DlgOnInitDialog);
        HANDLE_MSG(hWnd,WM_COMMAND,DlgOnCommand);
    default:return FALSE;
    }
    return TRUE;   // !
}

void DlgOnCommand(HWND hWnd,int id,HWND hWndCtrl,UINT CodeNotify)
{
    char *pszVolume;
    UINT n;
    
    switch(id)
    {
        case ID_COMBO:
            if(CodeNotify == CBN_SELCHANGE)
            {
                // индекс обновляется раньше, чем текст в ComboBox
                Index = ComboBox_GetCurSel(hWndCtrl);
                n = ComboBox_GetLBTextLen(hWndCtrl, Index)+1;
                pszVolume = new char[n];    // buffer overflow protection
                //SendMessage(hWndCtrl, CB_GETLBTEXT,(WPARAM)Index,(LPARAM)pszVolume);
                ComboBox_GetLBText(hWndCtrl, Index, pszVolume);
                FillInfo(hWnd,pszVolume);
                delete []pszVolume;
            } break;
        case IDCANCEL:EndDialog(hWnd,0);
    }
}

void FillInfo(HWND hWnd, LPSTR szVol)
{
    char szText[80];
    int nDriverType = GetDriveType(szVol);

    szText[0] = 0;    // если этого не сделать может возникнуть выход за пределы массива!!!

    switch (nDriverType)
    {
        case DRIVE_REMOVABLE:strcpy(szText,"Съёмний диск");
            break;
        case DRIVE_FIXED: strcpy(szText,"Жесткий диск");
            break;
        case DRIVE_CDROM: strcpy(szText,"СД-Диск");
            break;
    }
    SetWindowText(GetDlgItem(hWnd,ID_DRIVERTYPE),szText);

    char szLabel[20];
    char szFat[10];
    char szTemp[20];
    DWORD dwVolser = 0, dwMaxLen = 0, dwFlags = 0;

    szLabel[0] = szFat[0] = szTemp[0] = 0;


    GetVolumeInformation(szVol,szLabel,sizeof(szLabel),&dwVolser,&dwMaxLen,&dwFlags,szFat,sizeof(szFat));
    strcpy(szText,szLabel);
    strcat(szText,"\n");
    wsprintf(szTemp,"%X",dwVolser);

    strcat(szText,szTemp);
    strcat(szText,"\n");
    strcat(szText,szFat);
    SetWindowText(GetDlgItem(hWnd,ID_VOLINFO),szText);

    DWORD dwSectorsPerCluster = 0, dwBytesPerSector = 0, dwFreeCluster = 0, dwClusters = 0;
        // либо проверяй, что возвращает функция GetDiskFreeSpace, либо зануляй переменные.
    
    GetDiskFreeSpace(szVol,&dwSectorsPerCluster,&dwBytesPerSector,&dwFreeCluster,&dwClusters);
    wsprintf(szTemp,"%d",dwBytesPerSector);
    strcpy(szText,szTemp);
    strcat(szText,"\n");

    wsprintf(szTemp,"%d",dwSectorsPerCluster);
    strcat(szText,szTemp);
    strcat(szText,"\n");

    wsprintf(szTemp,"%d",dwClusters);
    strcat(szText,szTemp);
    strcat(szText,"\n");

    wsprintf(szTemp,"%d",dwFreeCluster);
    strcat(szText,szTemp);
    SetWindowText(GetDlgItem(hWnd,ID_DISKINFO),szText);
}

Автор: Zorak 21.1.2009, 20:11
586 ти становишся моим кумиром))... сулш.. а ещё такой вот вопрос.... ето програма у тебя нормально работает ?... ТОЕсть определяет ещё какие то диски кроме A:\ ?

Автор: 586 22.1.2009, 08:11
Все диски опрелеляет. Там ComboBox на одну строчку открывается, может с этим проблемы?

Автор: Zorak 22.1.2009, 14:53
та да)) В етом.... smile  свою ошибку уразумел.. Спасибо тебе ешё раз бльшущее  smile 

Автор: RomanK 22.8.2011, 22:03
Подниму темку. smile 

Вопросик к 586:
А зачем делать вот это:

Код

wsprintf(szTemp,"%X",dwVolser);


Я так понял, что возвращается один фиг не серийный номер "железа", а номер, который изменится при первом форматировании той же флешки например.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)