You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 17:20:38