GetLogicalDrives()for循环

我是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); } } 

函数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

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

 GetLogicalDrives() & 1 == 1 

如果驱动器A不可用, GetLogicalDrives() & 1将产生0并且条件将失败。

要检查下一个驱动器,您需要使用下一个2的倍数, GetLogicalDrives() & 2GetLogicalDrives() & 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. } }