C++ 如何获取物理驱动器&x27;谁的卷id? 问题
我正在尝试从物理驱动器获取卷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()的调用 模板静态
wchar\u t DriveInfo
提取卷idGetVirtualDiskPhysicalPath
之外,还有其他方法可以获取卷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;
}