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