如何获得系统有几个物理盘? GetLogicalDeviceString只能获得逻辑盘的信息,要想获得系统有几个物理硬盘怎么办呢? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 #include <windows.h>#include <winioctl.h>BOOLGetDriveGeometry(DISK_GEOMETRY *pdg){ HANDLE hDevice; // handle to the drive to be examined BOOL bResult; // results flag DWORD junk; // discard results hDevice = CreateFile("\\\\.\\PhysicalDrive0", // drive to open 0, // don't need any access to the drive FILE_SHARE_READ | FILE_SHARE_WRITE, // share mode NULL, // default security attributes OPEN_EXISTING, // disposition 0, // file attributes NULL); // don't copy any file's attributes if (hDevice == INVALID_HANDLE_VALUE) // we can't open the drive { return (FALSE); } bResult = DeviceIoControl(hDevice, // device we are querying IOCTL_DISK_GET_DRIVE_GEOMETRY, // operation to perform NULL, 0, // no input buffer, so pass zero pdg, sizeof(*pdg), // output buffer &junk, // discard count of bytes returned (LPOVERLAPPED) NULL); // synchronous I/O CloseHandle(hDevice); // we're done with the handle return (bResult);}intmain(int argc, char *argv[]){ DISK_GEOMETRY pdg; // disk drive geometry structure BOOL bResult; // generic results flag ULONGLONG DiskSize; // size of the drive, in bytes bResult = GetDriveGeometry (&pdg); if (bResult) { printf("Cylinders = %I64d\n", pdg.Cylinders); printf("Tracks per cylinder = %ld\n", (ULONG) pdg.TracksPerCylinder); printf("Sectors per track = %ld\n", (ULONG) pdg.SectorsPerTrack); printf("Bytes per sector = %ld\n", (ULONG) pdg.BytesPerSector); DiskSize = pdg.Cylinders.QuadPart * (ULONG)pdg.TracksPerCylinder * (ULONG)pdg.SectorsPerTrack * (ULONG)pdg.BytesPerSector; printf("Disk size = %I64d (Bytes) = %I64d (Mb)\n", DiskSize, DiskSize / (1024 * 1024)); } else { printf ("Attempt to get drive geometry failed. Error %ld.\n", GetLastError ()); } return ((int)bResult);}这个是NSDN中间的例子, 如果你想列举,只要稍微作一点改动就oK了.比如:GetDriveGeometry(DISK_GEOMETRY *pdg,DWORD i){ HANDLE hDevice; // handle to the drive to be examined BOOL bResult; // results flag DWORD junk; // discard results char drvs[256] ; sprintf(drvs, "\\\\.\\PhysicalDrive%d" , i ) ; hDevice = CreateFile(drvs, // drive to open"\\\\.\\PhysicalDrive0" 0, // don't need any access to the drive FILE_SHARE_READ | FILE_SHARE_WRITE, // share mode NULL, // default security attributes OPEN_EXISTING, // disposition 0, // file attributes NULL); // don't copy any file's attributes....然后主程序调用一个循环. for(DWORD i = 0 ; i< 6 ;i ++ ) { bResult = GetDriveGeometry (&pdg ,i); if (bResult ) { if ( pdg.MediaType == FixedMedia ) { AfxMessageBox("是硬盘") ; } } }注意的是,这个例子只是适用于win2k.nt如果是98,me 那么查看这个连接ms-help://MS.VSCC/MS.MSDNVS.2052/hardware/devio_89ph.htm 高手请帮忙,listview 类中处理LVN_ENDLABELEDIT消息事件中调用domodal跳出对话框出现问题, 怎么转成十进制的数啊??? 树形控件在析构时候用手动释放节点吗? ANSI转向Unicode注册表写入问题!! 如何直接判断文本框为空? 除了取值来判断~ 怎样将一个windows控件封装成对象?(noMFC) 怎样才能将消息队列中的消息输出到文件当中去呢? 关于托盘菜单 在MDI中写了一个元文件CMetaFileDC VC 画图小软件已经做好 帮忙保存成DXF格式,有偿劳动 请问如何在编写程序使CButton控件在运行时在不可选和可选状态间切换? 在视图中加滚动条问题
#include <winioctl.h>BOOL
GetDriveGeometry(DISK_GEOMETRY *pdg)
{
HANDLE hDevice; // handle to the drive to be examined
BOOL bResult; // results flag
DWORD junk; // discard results hDevice = CreateFile("\\\\.\\PhysicalDrive0", // drive to open
0, // don't need any access to the drive
FILE_SHARE_READ | FILE_SHARE_WRITE, // share mode
NULL, // default security attributes
OPEN_EXISTING, // disposition
0, // file attributes
NULL); // don't copy any file's attributes if (hDevice == INVALID_HANDLE_VALUE) // we can't open the drive
{
return (FALSE);
} bResult = DeviceIoControl(hDevice, // device we are querying
IOCTL_DISK_GET_DRIVE_GEOMETRY, // operation to perform
NULL, 0, // no input buffer, so pass zero
pdg, sizeof(*pdg), // output buffer
&junk, // discard count of bytes returned
(LPOVERLAPPED) NULL); // synchronous I/O CloseHandle(hDevice); // we're done with the handle return (bResult);
}int
main(int argc, char *argv[])
{
DISK_GEOMETRY pdg; // disk drive geometry structure
BOOL bResult; // generic results flag
ULONGLONG DiskSize; // size of the drive, in bytes bResult = GetDriveGeometry (&pdg); if (bResult)
{
printf("Cylinders = %I64d\n", pdg.Cylinders);
printf("Tracks per cylinder = %ld\n", (ULONG) pdg.TracksPerCylinder);
printf("Sectors per track = %ld\n", (ULONG) pdg.SectorsPerTrack);
printf("Bytes per sector = %ld\n", (ULONG) pdg.BytesPerSector); DiskSize = pdg.Cylinders.QuadPart * (ULONG)pdg.TracksPerCylinder *
(ULONG)pdg.SectorsPerTrack * (ULONG)pdg.BytesPerSector;
printf("Disk size = %I64d (Bytes) = %I64d (Mb)\n", DiskSize,
DiskSize / (1024 * 1024));
} else {
printf ("Attempt to get drive geometry failed. Error %ld.\n",
GetLastError ());
} return ((int)bResult);
}
这个是NSDN中间的例子, 如果你想列举,只要稍微作一点改动就oK了.比如:
GetDriveGeometry(DISK_GEOMETRY *pdg,DWORD i)
{
HANDLE hDevice; // handle to the drive to be examined
BOOL bResult; // results flag
DWORD junk; // discard results
char drvs[256] ;
sprintf(drvs, "\\\\.\\PhysicalDrive%d" , i ) ;
hDevice = CreateFile(drvs, // drive to open"\\\\.\\PhysicalDrive0"
0, // don't need any access to the drive
FILE_SHARE_READ | FILE_SHARE_WRITE, // share mode
NULL, // default security attributes
OPEN_EXISTING, // disposition
0, // file attributes
NULL); // don't copy any file's attributes
....然后主程序调用一个循环.
for(DWORD i = 0 ; i< 6 ;i ++ )
{
bResult = GetDriveGeometry (&pdg ,i);
if (bResult )
{
if ( pdg.MediaType == FixedMedia )
{
AfxMessageBox("是硬盘") ;
}
}
}
注意的是,这个例子只是适用于win2k.nt
如果是98,me
那么查看这个连接
ms-help://MS.VSCC/MS.MSDNVS.2052/hardware/devio_89ph.htm