使用SHFormatDrive函数实现格式化磁盘

Theheartoflove

发布日期: 2018-12-20 12:10:44 浏览量: 1420
评分:
star star star star star star star star star_border star_border
*转载请注明来自write-bug.com

背景

某天,无意中在网上搜索资料的时候,看到一篇帖子,就是将如何编程实现格式化操作的。我便看了下,原来调用的是 SHFormatDrive 函数实现的。和我们选中磁盘驱动器,鼠标右击选择“格式化(A)…”弹出来的格式化窗口是同一个。也就是说,SHFormatDrive 实现的就是我们选中磁盘,点击格式化操作的过程,并不能实现静默格式化磁盘。

好吧,确实让你失望了,我们这篇文章还是讲解下 SHFormatDrive 函数的使用,实现弹出格式化窗口的操作。对于静默格式化,目前我没有深究过。但是,我也想到一种感觉或许可行的静默实现思路,就是隐藏弹出的格式化的选择窗口,然后发送开始格式化的消息给隐藏的窗口,这样,就可以静静地进行格式化操作了。不过这个方法我没有试过,等以后闲来无事而且想深究的时候,我再试吧。

现在,我就把 SHFormatDrive 实现有弹窗格式化磁盘的过程整理成文档,分享给大家。

函数介绍

SHFormatDrive 函数

打开Shell的格式化对话框。

函数声明

  1. DWORD SHFormatDrive(
  2. _In_ HWND hwnd,
  3. UINT drive,
  4. UINT fmtID,
  5. UINT options
  6. );

参数

  • hwnd [in]
    对话框的父窗口的句柄。格式对话框必须有父窗口,因此,此参数不能为NULL。
  • driver
    驱动器格式化。该参数的值表示从 A 开始为 0 的字母驱动器。例如,值 2 代表C:驱动器。
  • fmtID
    物理格式的ID。目前仅定义了:SHFMT_ID_DEFAULT(0xFFFF),表示默认格式ID。
  • options
    此值必须为 0 或以下值之一才能更改对话框中的默认格式选项。该值被视为一个位域,应该相应地对待。
    SHFMT_OPT_FULL(0x0001):如果设置了此标志,则选择快速格式选项。
    SHFMT_OPT_SYSONLY(0x0002):选择创建MS-DOS启动磁盘选项,创建一个系统引导磁盘。

返回值

  • 返回上一个成功格式的格式ID或以下值之一。 该值的LOWORD可以作为fmtID参数在后续调用中传递,以重复最后一个格式。
VALUE MEANING
SHFMT_ERROR 最后一个格式出现错误。 这不表示驱动器是不可格式化的
SHFMT_CANCEL 最后一个格式被取消
SHFMT_NOFORMAT 驱动器无法格式化

实现过程

由上述的函数介绍中,我们知道,SHFormatDrive 的第一个参数是要关联一个窗口的句柄,而且这个参数不能为NULL。所以,这需要获取我们程序窗口的句柄,传递给它。本文给的例子程序,是一个控制台程序,所以,我们可以调用WIN32 API函数 GetConsoleWindow 获取当前控制台程序的窗口句柄。

  1. // 获取控制台程序窗口句柄
  2. HWND hWnd = ::GetConsoleWindow();

然后,我们就可以大胆地调用 SHFormatDrive 函数打开指定驱动器的格式化窗口了。其中,第 1 个参数表示关联窗口的窗口句柄;第 2 个参数表示要格式化的驱动器,该参数的值是以大写字母 A 开始为 0 的驱动器;第 3 个参数目前只有一个固定的值SHFMT_ID_DEFAULT,表示默认格式ID;第 4 个参数可以设置格式化对话框的格式化选项。

  1. ::SHFormatDrive(hParentWnd, (cDriverName - 'A'), SHFMT_ID_DEFAULT, 0);

编码实现

导入库文件

  1. #include <ShlObj.h>
  2. #pragma comment(lib, "Shell32.lib")

格式化操作

  1. BOOL FormatDriver(HWND hParentWnd, char cDriverName)
  2. {
  3. ::SHFormatDrive(hParentWnd, (cDriverName - 'A'), SHFMT_ID_DEFAULT, 0);
  4. return TRUE;
  5. }

程序测试

我们运行程序,程序成功弹窗格式化E盘的格式化窗口。

总结

这个功能实现,关键是对 SHFormatDrive 函数的理解。大家在编码实现之前,可以先仔细阅读函数介绍部分的内容,这样,在调用 SHFormatDrive 函数的时候,就可以做到知其然,知其所以然了。

参考

参考自《Windows黑客编程技术详解》一书

上传的附件 cloud_download SHFormatDrive_Test.7z ( 142.98kb, 9次下载 )

发送私信

昨日渐多,明日渐少,这就是人生

13
文章数
26
评论数
最近文章
eject