GetLogicalDrives () для цикла

Я новичок в API Win32 и мне нужна помощь, пытаясь понять, как работает функция GetLogicalDrives (). Я пытаюсь заполнить cbs_dropdownlist всеми доступными дисками, которые не используются. вот что у меня так далеко. Буду признателен за любую помощь.

void FillListBox(HWND hWndDropMenu)
{
 DWORD drives = GetLogicalDrives();
 for (int i=0; i<26; i++)
 {
    SendMessage(hWndDropMenu, CB_ADDSTRING, 0, (LPARAM)drives);
 }
}

Ответы на вопрос(2)

GetLogicalDrives возвращает битовую маску и для ее проверки вам нужно использовать побитовые операторы. Чтобы узнать, используется ли диск A:

Если диск A недоступен,GetLogicalDrives() & 1 даст0 и условие не выполнится.

Чтобы проверить следующий диск, вам нужно использовать следующий кратный 2,GetLogicalDrives() & 2, GetLogicalDrives() & 4 и так далее.

Вы могли бы использоватьGetLogicalDriveStrings но это возвращает обратное тому, что вы хотите, все используемые логические диски.

Я бы вместо этого построил таблицу и внес бы в нее индекс:

const char *drive_names[] = 
{
    "A:",
    "B:",
    ...
    "Z:"
};

Тогда ваш цикл может быть:

DWORD drives_bitmask = GetLogicalDrives();

for (DWORD i < 0; i < 32; i++)
{
    // Shift 1 to a multiple of 2. 1 << 0 = 1 (0000 0001), 1 << 1 = 2 etc.
    DWORD mask_index = 1 << i;
    if (drives_bitmask & i == 0)
    {
        // Drive unavailable, add it to list.
        const char *name = drive_names[i];
        // ... do GUI work.
    }
}
Решение Вопроса

GetLogicalDrives возвращаетbitmask из доступных логических дисков. Вот как бы вы это сделали:

 DWORD drives = GetLogicalDrives();
 for (int i=0; i<26; i++)
 {
    if( !( drives & ( 1 << i ) ) )
    {
       TCHAR driveName[] = { TEXT('A') + i, TEXT(':'), TEXT('\\'), TEXT('\0') };
       SendMessage(hWndDropMenu, CB_ADDSTRING, 0, (LPARAM)driveName);
    }
 }

Код проверяет, является лиi-th немного вbitmask являетсяnot установлен в1 или жеtrue.

 arynhard09 июн. 2012 г., 20:02
Спасибо! Вы были очень полезны.
 arynhard09 июн. 2012 г., 19:57
Из того, что я понимаю,GetLogicalDrives() возвращает битовую маску, которая содержит ноль, если диск доступен. Я хочу заполнить выпадающий список только теми буквами, которые не используются. Есть лиGetLogicalDriveStrings() вернуть все диски, даже если они используются?
 arynhard09 июн. 2012 г., 20:04
Небольшая проблема. Я получаю кучу китайских иероглифов в моем списке.
 09 июн. 2012 г., 19:58
@arynhard: Извините, я пропустил, что вы хотели противоположность логических дисков. Обновил мой ответ, чтобы отразить это.
 09 июн. 2012 г., 20:05
@arynhard: я бы поверил, что вы используетеUnicode вместоMultiByte символы, изменитьCHAR заWCHAR и каждый случай'?' заL'?', Проклятые теWindows макросы, которые не могут поймать простейшие ошибки ...

Ваш ответ на вопрос