1

我是 win32 api 的新手,需要帮助来了解 GetLogicalDrives() 函数的工作原理。我正在尝试使用所有未使用的可用驱动器填充 cbs_dropdownlist。这是我到目前为止所拥有的。我将不胜感激任何帮助。

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

2 回答 2

10

该函数GetLogicalDrives返回可用逻辑驱动器的位掩码。以下是您的操作方法:

 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位是否设置为或。1true

于 2012-06-09T17:53:14.437 回答
4

GetLogicalDrives返回一个位掩码并检查它,您需要使用按位运算符。要查看驱动器 A 是否正在使用中:

GetLogicalDrives() & 1 == 1

如果驱动器 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.
    }
}
于 2012-06-09T18:09:10.967 回答