WINAPI。应用程序提供有关磁盘的错误信

时间:2016-01-03 18:32:05

标签: c++ winapi

我写的应用程序给了我关于我的磁盘的信息。但有一个例外。我将我的应用程序保存在桌面C:上。应用程序向我提供有关pendrive和磁盘E:但不是磁盘C:的正确信息。 当我在pendrive上复制我的应用程序并运行它(从pendrive)时 - 我得到关于磁盘C:和E的正确信息:但不是为了PENDRIVE。

问题在于功能GetVolumeInformation。这个函数给我错误的信息(仅适用于我运行我的应用程序的磁盘)

GetVolumeInformation( ListItem, volumeNameBuffer, MAX_PATH, & volumeSerialNumber, & maximumComponentLength, & fileSystemFlags, fileSystemNameBuffer, MAX_PATH );

总结: 我有关于所有磁盘的正确信息(DISK TYPE,SIZE) 关于来自GetVolumeInformation函数的参数的错误信息,但仅适用于我运行应用程序的磁盘。 wrong info right info

1 个答案:

答案 0 :(得分:1)

如果我将ListItem var设置为保持“C:”,则代码成功。如果我将此var设置为保持“D:”,则会失败,FormatMessageGetLastError报告:The filename, directory name, or volume label syntax is incorrect.

如果我改为将var设置为“D:/”或“D:\\”,那么它就会成功。对于我系统中存在的所有逻辑驱动器号也是如此。

仔细查看GetVolumeInformation的文档,我们可以看到它所期望的第一个参数是一个字符串,用于保存要描述的卷的根目录 。因此,如果您只是传递C:或D:等,则传递相关驱动器的当前目录,该目录可能是也可能不是根目录。如果它不是根,*繁荣*!

另外,在旁注中 - 卷序列号是32位数字,通常以十六进制表示法显示。以下代码段的格式与dir命令的格式相同。

printf("Vol ser#: '%X-%X'\n", (volumeSerialNumber>>16) , (volumeSerialNumber&0xFFFF) );

<强>结果 Vol ser#: 'AA25-7CEF'

与之相比:

printf("Vol ser#: '%X'\n", volumeSerialNumber );结果: Vol ser#:'AA257CEF')

printf("Vol ser#: '%u'\n", volumeSerialNumber );结果: Vol ser#:'2854583535')