Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何获取物理驱动器&x27;谁的卷id? 问题_C++_Winapi_Visual C++_Disk - Fatal编程技术网

C++ 如何获取物理驱动器&x27;谁的卷id? 问题

C++ 如何获取物理驱动器&x27;谁的卷id? 问题,c++,winapi,visual-c++,disk,C++,Winapi,Visual C++,Disk,我正在尝试从物理驱动器获取卷id 我的代码 我试过的 问题 没有运算符“>>”与这些操作数匹配 问题 如何从wchar\u t DriveInfo提取卷id 除了GetVirtualDiskPhysicalPath之外,还有其他方法可以获取卷id吗 我从某个我记不起来的地方抄袭了这段代码,但它似乎可以从第一个有效驱动器获取序列号。很抱歉,如果它不能编译,我不得不用通用的string类替换我们自己的string类。您可能希望从中得到的是对GetVolumeInformation()的调用 模板静态

我正在尝试从物理驱动器获取卷id

我的代码 我试过的 问题 没有运算符“>>”与这些操作数匹配

问题
  • 如何从
    wchar\u t DriveInfo
    提取卷id
  • 除了
    GetVirtualDiskPhysicalPath
    之外,还有其他方法可以获取卷id吗

  • 我从某个我记不起来的地方抄袭了这段代码,但它似乎可以从第一个有效驱动器获取序列号。很抱歉,如果它不能编译,我不得不用通用的string类替换我们自己的string类。您可能希望从中得到的是对GetVolumeInformation()的调用

    模板静态常量ELT*NextToken(常量ELT*ptr){
    //跳过此以null结尾的字符串
    而(*ptr!=0){
    ptr++;
    }
    ptr++;
    返回ptr;
    }
    int getDiskId(){
    int bufSize=GetLogicalDriveStrings(0,0);
    WCHAR*buffer=新的WCHAR[bufSize];
    GetLogicalDriveStrings(bufSize,buffer);
    向量驱动字符串;
    for(常数WCHAR*ptr=buffer;*ptr!=0;ptr=NextToken(ptr)){
    如果(toupper(*ptr)='A'| | toupper(*ptr)=='B'){
    继续;
    }
    std::字符串tmp;
    tmp+=toupper(*ptr);
    驱动串。推回(tmp);
    }
    //先要最低的字母
    排序(driveStrings.begin(),driveStrings.end());
    对于(int i=0;i
    我认为这只适用于指定了驱动器号的卷的特殊情况。这也无法确定哪个驱动器号(如果有)属于该驱动器。它只会选择C:99%的时间。此外,A:和B:是合法的硬盘驱动器号。安德烈·梅迪科:嗯,我想从技术上讲是正确的,但我真的不建议使用它们。我讨厌去想有多少生产代码具有类似的硬编码假设。通常,一个物理驱动器对象没有卷ID,只有该驱动器上的各个分区有卷ID。我认为,挂载的.vhd通常也是如此。(但我不确定您是否安装了ISO。)
    // define disk handle
    HANDLE VDHANDLE;
    
    // set "open disk" parameters
    OPEN_VIRTUAL_DISK_PARAMETERS VHD_OPEN_PARAM;
    VHD_OPEN_PARAM.Version = OPEN_VIRTUAL_DISK_VERSION_1;
    VHD_OPEN_PARAM.Version1.RWDepth = OPEN_VIRTUAL_DISK_RW_DEPTH_DEFAULT;
    
    // set storage type
    VIRTUAL_STORAGE_TYPE VHD_STORAGE;
    VHD_STORAGE.DeviceId = VIRTUAL_STORAGE_TYPE_DEVICE_VHD;
    VHD_STORAGE.VendorId = VIRTUAL_STORAGE_TYPE_VENDOR_MICROSOFT;
    
    // set "attach disk" parameters
    ATTACH_VIRTUAL_DISK_PARAMETERS VHD_ATTACH_PARAM;
    VHD_ATTACH_PARAM.Version = ATTACH_VIRTUAL_DISK_VERSION_1;
    
    // open disk
    if ( OpenVirtualDisk( &VHD_STORAGE, L"F:\\MyStorageBunker.vhd",
                          VIRTUAL_DISK_ACCESS_ALL, OPEN_VIRTUAL_DISK_FLAG_NONE,
                          &VHD_OPEN_PARAM, &VDHANDLE ) != ERROR_SUCCESS )
    {
        return ERR_MOUNT_SCRIPTCREATE;
    }
    
    // attach drive
    if ( AttachVirtualDisk( VDHANDLE, 0, ATTACH_VIRTUAL_DISK_FLAG_PERMANENT_LIFETIME,
                            0, &VHD_ATTACH_PARAM, 0 ) != ERROR_SUCCESS )
    {
        return ERR_MOUNT_SCRIPTEXECUTE;
    }
    
    // Get attached drive & info
    wchar_t DriveInfo[ MAX_PATH ];
    ULONG bufferSize = sizeof( DriveInfo );
    GetVirtualDiskPhysicalPath( VDHANDLE, &bufferSize, DriveInfo );
    // DriveInfo raw output = \PHYSICALDISKX
    // X = volume id
    
    std::wstringstream tmp;
    int value;
    char c;
    std::wstringstream  ss( DriveInfo );
    ss >> tmp >> c >> value;
    
    template <class ELT> static const ELT* NextToken(const ELT* ptr) {
        // Skip this null-terminated string
        while (*ptr != 0) {
            ptr++;
        }
        ptr++;
        return ptr;
    }
    int getDiskId() {
        int bufSize = GetLogicalDriveStrings(0, 0);
        WCHAR* buffer = new WCHAR[bufSize];
        GetLogicalDriveStrings(bufSize, buffer);
        std::vector<std::string> driveStrings;
        for (const WCHAR *ptr = buffer; *ptr != 0; ptr = NextToken(ptr)) {
            if (toupper(*ptr) == 'A' || toupper(*ptr) == 'B') {
                continue;
            }
            std::string tmp;
            tmp += toupper(*ptr);
            driveStrings.push_back(tmp);
        }
        // want lowest letter first
        std::sort(driveStrings.begin(), driveStrings.end());
        for (int i = 0; i < driveStrings.size(); i++) {
            DWORD dummy(0);
            DWORD serialNumber(0);
            if (
                GetVolumeInformation(
                    driveStrings[i].c_str(),        // lpRootPathName
                    0,          // lpVolumeNameBuffer
                    0,          // nVolumeNameSize
                    &serialNumber,
                    &dummy,     // lpMaximumComponentLength
                    &dummy,     // lpFileSystemFlags
                    0,          // lpFileSystemNameBuffer
                    0           // nFileSystemNameSize
                )
            ) {
                break;
            }
        }
        delete [] buffer;
        return serialNumber;
    }