GetLogicalDrives - 代码在本地运行,但不在虚拟机中运行

时间:2017-12-30 12:01:59

标签: c++ winapi

我有代码来获取驱动器号。我的系统中的代码很好,但它在虚拟机(VMWare)中不起作用:

std::vector<TCHAR*> DrivesName = { _T("A:\\"), _T("B:\\"), _T("C:\\"), _T("D:\\"), _T("E:\\"),
    _T("F:\\"), _T("G:\\"), _T("H:\\"), _T("I:\\"), _T("J:\\"),
    _T("K:\\"), _T("L:\\"), _T("M:\\"), _T("N:\\"), _T("O:\\"),
    _T("P:\\"), _T("Q:\\"), _T("R:\\"), _T("S:\\"), _T("T:\\"),
    _T("U:\\"), _T("V:\\"), _T("W:\\"), _T("X:\\"), _T("Y:\\"), _T("Z:\\") };

DWORD drivesBitmask = GetLogicalDrives();
if (drivesBitmask == 0)
{
    std::cout << "ERROR";
}

for (int i = 0; i < 26; i++)
{
    if ((drivesBitmask & 1) == 0)
    {
        if (typeDriver != DRIVE_NO_ROOT_DIR) 
        {
            std::cout << "Drive: " << DrivesName[i] << std::endl;
        }
    }
}

我将(drivesBitmask&amp; 1)== 0条件改为(drivesBitmask&amp; 2)== 0它有效,但我不明白....

有什么不同?

1 个答案:

答案 0 :(得分:4)

您未正确测试,因此根据A驱动器是否存在,最终将所有驱动器打印为已存在(并且测试已反转,因此它仅当A 存在时才会打印;我猜测您的系统之间存在差异。

要修复,请更改测试以使用i按顺序测试每个位,而不是反复测试相同的位,并避免反转测试(由于与0比较而不是检查非 - 零值),改变:

if ((drivesBitmask & 1) == 0)

为:

if (drivesBitmask & (1 << i))