GetLogicalDrives和位置23

时间:2017-11-01 04:26:45

标签: c winapi

据我了解,如果我想检查 X:\ 驱动器,如果使用GetLogicalDrives功能,则为23位;所以,我试图测试一下,但如果我将位掩码设置为0,它会变为>>=23

这是我的代码:

DWORD drives;

drives = GetLogicalDrives();

drives >>= 23;

if (drives == 0)
{
    wprintf(L"Error: %lu\n", GetLastError());
}
else if (drives & 1)
{
    wprintf(L"Drive is mounted\n");

}       
else
{
    wprintf(L"Drive is not mounted\n");
}

修改 现在,如果我将drives设置为17,我相信它会引用字母R,它将在第一个else中进行测试,并且如果没有安装,将转到第二个;所以它会显示Drive is not mounted。如果我设置drives>>=1,它就是B,我认为是相同的。

0 19T}至25(字母Z),如果未加载{{1}},它将获得{{1}}。

我做错了什么?

先谢谢。

1 个答案:

答案 0 :(得分:1)

根据文件:

  

如果函数成功,则返回值是表示当前可用磁盘驱动器的位掩码。位位置0(最低有效位)是驱动器A,位位置1是驱动器B,位位置2是驱动器C,依此类推。

     

如果函数失败,则返回值为零。要获取扩展错误信息,请致电GetLastError

如果函数成功并且位掩码在X之后不包含驱动器的任何位,则移位的结果将为0,从而导致代码报告错误错误。您需要在GetLogicalDrives()返回后立即检查0 ,然后再转移:

DWORD drives = GetLogicalDrives();
if (drives == 0)
{
    wprintf(L"Error: %lu\n", GetLastError());
}
else
{
    drives >>= 23;
    if (drives & 1)
        wprintf(L"Drive is mounted\n");
    else
        wprintf(L"Drive is not mounted\n");
}

话虽如此,你根本不需要移动位掩码本身:

DWORD drives = GetLogicalDrives();
if (drives == 0)
{
    wprintf(L"Error: %lu\n", GetLastError());
}
else
{
    //if (drives & 0x800000)
    if (drives & (1<<23))
        wprintf(L"Drive is mounted\n");
    else
        wprintf(L"Drive is not mounted\n");
}