/ / GetLogicalDrives()forループ - c ++、c、winapi

GetLogicalDrives()forループ - c ++、c、winapi

私は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);
}
}

回答:

回答№1は8

関数 GetLogicalDrives 返す ビットマスク 使用可能な論理ドライブの数。あなたのやり方は次のとおりです:

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

コードは、 i番目 のビット ビットマスクない に設定 1 または true.


回答№2の場合は3

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.
}
}