我是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);
}
}
答案 0 :(得分:9)
函数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-th 位是否 设置为1
或{{1} }。
答案 1 :(得分: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.
}
}