调用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 函数用法如下:
函数的返回值是最后一次成功格式化的碰盘标识,或者是下列取值之一:
SHFMT_ERROR 上次格式化出错,磁盘可能被格式化
SHFMT_CANCEL 格式化被取消
SHFMT_NOFORMAT 不能进行磁盘格式化
实现代码如下:
参考资料:
[版权声明]
本文采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可。
我都照做了,下载安装了 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);参考资料:
- 磁盘格式化的编程实现
- 《Windows 程序设计》(王艳平编著),第八章 Windows 文件操作的内存映射
[版权声明]
本文采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可。