调用Windows外壳程序格式化磁盘

看资料介绍说 Windows 2000 以上的 SDK 提供了格式化逻辑驱动器的函数 SHFormatDrive, 这是一个外壳函数(Windows界面操作环境称之为外壳),从 shell32.dll 库导出,调用后会弹出一个格式化对话框,只有用户单击"开始"按钮后格式化才开始,使用时应包含头文件 shlobj.h 


我都照做了,下载安装了 Windows XP SP2 的 SDK, 并配置在了 VC 的 include和lib目录中了,也把新SDK的目录调到了最上面,程序中也包含了 shlobj.h, 而且看到新的 SDK 的 shlobj.h 中确实有 SHFormatDrive 函数原型,可是当我使用 SHFormatDrive 函数编译时总提示我找不到这个符号。不知道发生什么问题了,留待以后有需求时再解决吧,反正就是预编译宏展开时,不是去 include 新的 SDK 的 shlobj.h 文件,include 的是 VC98 中的 shlobj.h 文件。 无奈之时,只能手工的加载 shell32.dll, 找到 SHFormatDrive 函数地址进行调用了。

 SHFormatDrive 函数用法如下:
1DWORD SHFormatDrive(
2       HWND hwnd;   //为格式化对话框指定父窗口句柄
3       UINT drive,  //要格式化的驱动器。0代表A盘,1代表B盘,依次类推
4       UINT fmtID,  //物理格式标识,仅有一个值可用:SHFMT_ID_DEFAULT
5       UINT options
6    //用于改变对话框的默认选项。0表示默认,SHFMT_OPT_FULL 表示选中"快速格式化"选项,
7    //SHFMT_OPT_SYSONLY 表示选中"创建一个MS-DOS启动盘"选项
8);

函数的返回值是最后一次成功格式化的碰盘标识,或者是下列取值之一:
SHFMT_ERROR         上次格式化出错,磁盘可能被格式化
SHFMT_CANCEL         格式化被取消
SHFMT_NOFORMAT       不能进行磁盘格式化 

实现代码如下: 
 1//像新的SDK那样定义几个宏,你也可以不定义这几个宏,在传参或判断返回值是直接用常量值
 2#define SHFMT_ID_DEFAULT    0xFFFF
 3#define SHFMT_OPT_FULL     0x0001
 4#define SHFMT_OPT_SYSONLY  0x0002
 5#define SHFMT_ERROR     0xFFFFFFFFL
 6#define SHFMT_CANCEL    0xFFFFFFFEL
 7#define SHFMT_NOFORMAT  0xFFFFFFFDL
 8
 9//定义要导出的函数指针类型
10typedef DWORD (WINAPI * PFNSHFORMATDRIVE)(HWND hwnd,UINT drive,UINT fmtID,UINT options);
11
12//加载 Shell32.dll 动态库
13HINSTANCE hInstance=LoadLibrary("Shell32.dll");
14
15if(hInstance==NULL) {
16    return;
17}
18
19//定义函数 SHFormatDrive 的地址
20PFNSHFORMATDRIVE pFnSHFormatDrive=(PFNSHFORMATDRIVE)::GetProcAddress(hInstance,"SHFormatDrive");
21
22if(pFnSHFormatDrive==NULL) {
23    FreeLibrary(hInstance);
24    return;
25}
26
27//调用函数 SHFormatDrive
28DWORD dwRet = (pFnSHFormatDrive)(NULL,2,SHFMT_ID_DEFAULT,SHFMT_OPT_FULL);
29
30//父窗口句可以传NULL,如果你是窗口程序中可以用以下两个函数得到 HWND 传入
31
32//HWND hParentWnd = this->GetSafeHwnd()
33//HWND hParentWnd = AfxGetMainWnd()->GetSafeHwnd()
34
35//释放句柄资源
36FreeLibrary(hInstance);

参考资料:
  1. 磁盘格式化的编程实现
  2. 《Windows 程序设计》(王艳平编著),第八章 Windows 文件操作的内存映射
永久链接 https://yanbin.blog/windows-call-shell-format-disk/, 来自 隔叶黄莺 Yanbin's Blog
[版权声明] 本文采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可。