1

私はwin32apiを初めて使用し、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し、条件は失敗します。

GetLogicalDrives() & 2次のドライブを確認するには、次の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 に答える