Delphi调用ShFormatDrive为何快速格式化复选框始终被勾选?
问题:为何两种情况下Windows格式化对话框的“快速格式化”复选框都处于勾选状态?
function FormatUSBDrive(const DriveLetter: Char; const QuickFormat: Boolean): String; var FmtRes: Longint; cCharTemp: Char; nDrive: UINT; handle: THandle; begin try handle := Application.Handle; cCharTemp := Upcase(DriveLetter); nDrive := Ord(cCharTemp) - Ord('A'); if QuickFormat then FmtRes := ShFormatDrive(Handle, nDrive, SHFMT_ID_DEFAULT, SHFMT_OPT_QUICKFORMAT) else FmtRes := ShFormatDrive(Handle, nDrive, SHFMT_ID_DEFAULT, SHFMT_OPT_FULLFORMAT); // case FmtRes of SHFMT_ERROR: Result := 'Error: Formatting the drive failed.'; SHFMT_CANCEL: Result := 'User canceled formatting the drive.'; SHFMT_NOFORMAT: Result := 'Error: Drive cannot be formatted.'; else Result := 'Disk has been formatted!'; end; except on E:Exception do Result := 'FormatUSBDrive - Error:' + #13 + E.Message; end; end;
在两种情况下,Windows格式化对话框弹出时"快速格式化"复选框均处于勾选状态。我哪里操作出错了?
注意:我并非询问如何格式化USB驱动器——我的代码在这方面运行正常!我想知道为何两种情况下"快速格式化"复选框都会被勾选!
问题出在你对ShFormatDrive函数第四个参数的理解和使用上:
- Windows API的
ShFormatDrive中,并没有官方定义的SHFMT_OPT_FULLFORMAT常量。该函数的格式化选项参数仅支持SHFMT_OPT_QUICKFORMAT(值为0x00000001)这一个有效选项,用于指定启用快速格式化。 - 当需要执行全格式化时,不需要传递任何特殊选项,直接给第四个参数传
0即可。你当前传递的SHFMT_OPT_FULLFORMAT属于无效值,API无法识别该选项,最终默认保持了快速格式化的勾选状态。
修改代码的else分支即可解决:
else FmtRes := ShFormatDrive(Handle, nDrive, SHFMT_ID_DEFAULT, 0); // 传递0而非SHFMT_OPT_FULLFORMAT
调整后,当QuickFormat为false时,弹出的格式化对话框中“快速格式化”复选框就会处于未勾选状态。
内容的提问来源于stack exchange,提问作者tua
相关产品推荐
相关产品推荐

