请问格式化硬盘德API函数是那个,急呀

zt2008 2003-09-30 09:35:21
请问格式化硬盘德API函数是那个,急呀
...全文
371 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
robertnet 2003-09-30
  • 打赏
  • 举报
回复
system("format: c");
AkiraChing 2003-09-30
  • 打赏
  • 举报
回复
以下摘自是一篇文章
从实际应用的角度看,从Windows 9X到Windows NT都应该提供这个FormatDisk函数,否则怎么实现资源管理器窗口的磁盘格式化呢?笔者通过仔细查找发现,Windows 确实提供了这样一个函数,尽管文档资料没有注明,但是如果我们使用View Dependencies打开Shell2.dll,就会发现这个函数。它就是SHFormatDrive,编译连接到Shell32.lib。尽管通过平台的SDK文档和SHELLAPI.H文件并不能发现这个函数,但是Win32各个操作系统都能找到它的踪影。应用程序可以通过调用这个函数实现借用外壳的磁盘格式化对话框格式化磁盘。调用约定如下:
DWORD WINAPI SHFormatDrive(HWND hwnd,UINT drive,UINT fmtID,UINT options);
参数含义如下:
hwnd:拥有对话框的窗口句柄,注意hwnd为NULL时,并不会导致这个对话框生成一个上层的应用程序,也就是说,这个参数总是非NULL,这个对话框只能作为一个窗口的子窗口,而不能作为一个单独的应用程序;
drive:要格式化的驱动器号,以A: == 0为基准,依此类推;
fmtID:必须设定为 SHFMT_ID_DEFAULT,即0xFFFF;
options:可以有两个选择项:SHFMT_OPT_FULL 0x0001和SHFMT_OPT_SYSONLY 0x0002,如果这一项设置为零,系统就要使用快速格式化作为默认设置。
该函数的返回值要么为一个下列以SHFMT_开头的值,要么是一个成功格式化的磁盘标识。
//上次格式化出错,磁盘可能被格式化
#define SHFMT_ERROR 0xFFFFFFFFL
//格式化被取消
#define SHFMT_CANCEL 0xFFFFFFFEL
// 不能进行磁盘格式化
#define SHFMT_NOFORMAT 0xFFFFFFFDL
实现步骤
1.函数接口声明
typedef DWORD (WINAPI *PFNSHFORMATDRIVE)(HWND hwnd,UINT drive,UINT fmtID,UINT options);
2.加载Shell32.dll库
HINSTANCE hInstance=LoadLibrary(_T
(“Shell32.dll”));
If(hInstance==NULL) return;
3.获得函数指针
PFNSHFORMATDRIVE pFnSHFormatDrive=(
PFNSHFORMATDRIVE)GetProcessAddress(_T
(“SHFormatDrive”));
if(pFnSHFormatDrive==NULL)
{
FreeLibrary(hInstance);
return;
}
4.调用函数
(pFnSHFormatDrive)(hwnd,drive/*a:==0*/,fmtID/* SHFMT_ID_DEFAULT */,options);
5.释放句柄资源
FreeLibrary(hInstance);
Return;
本程序在Windows 2000环境下调试通过,使用Delphi、Visual Basic的用户通过调用上述Windows SDK 函数也可以实现磁盘格式化。
/*****************************************************************/

也可以直接调用
DWORD SHFormatDrive( HWND hwnd,
UINT drive,//0 for A:, 2 for C:,...
UINT fmtID,//SHFMT_ID_DEFAULT only
UINT options//SHFMT_OPT_FULL取消快格,进行全格
//SHFMT_OPT_SYSONLY 创建ms-dos启动盘
);
包含在头文件shlobj.h,for2k

codewarrior(会思考的草) 的只能用于格式化软驱

会思考的草 2003-09-30
  • 打赏
  • 举报
回复
过奖过奖:)
__________________ 2003-09-30
  • 打赏
  • 举报
回复
会思考的草怎么这么厉害。什么问题都回答的很出色!佩服!
会思考的草 2003-09-30
  • 打赏
  • 举报
回复
typedef struct _DISK_GEOMETRY
{
LARGE_INTEGER Cylinders; // 柱面数
MEDIA_TYPE MediaType; // 介质类型
DWORD TracksPerCylinder; // 每柱面的磁道数
DWORD SectorsPerTrack; // 每磁道的扇区数
DWORD BytesPerSector; // 每扇区的字节数
} DISK_GEOMETRY;

// 打开磁盘
HANDLE OpenDisk(LPCTSTR filename)
{
HANDLE hDisk;

// 打开设备
hDisk = ::CreateFile(filename, // 文件名
GENERIC_READ | GENERIC_WRITE, // 读写方式
FILE_SHARE_READ | FILE_SHARE_WRITE, // 共享方式
NULL, // 默认的安全描述符
OPEN_EXISTING, // 创建方式
0, // 不需设置文件属性
NULL); // 不需参照模板文件

return hDisk;
}

// 获取磁盘参数
BOOL GetDiskGeometry(HANDLE hDisk, PDISK_GEOMETRY lpGeometry)
{
DWORD dwOutBytes;
BOOL bResult;

// 用IOCTL_DISK_GET_DRIVE_GEOMETRY取磁盘参数
bResult = ::DeviceIoControl(hDisk, // 设备句柄
IOCTL_DISK_GET_DRIVE_GEOMETRY, // 取磁盘参数
NULL, 0, // 不需要输入数据
lpGeometry, sizeof(DISK_GEOMETRY), // 输出数据缓冲区
&dwOutBytes, // 输出数据长度
(LPOVERLAPPED)NULL); // 用同步I/O

return bResult;
}

// 从指定磁道开始格式化磁盘
BOOL LowLevelFormatTracks(HANDLE hDisk, PDISK_GEOMETRY lpGeometry, DWORD dwStartCylinder, DWORD dwCylinderNumber)
{
FORMAT_PARAMETERS FormatParameters;
PBAD_TRACK_NUMBER lpBadTrack;
DWORD dwOutBytes;
DWORD dwBufSize;
BOOL bResult;

FormatParameters.MediaType = lpGeometry->MediaType;
FormatParameters.StartCylinderNumber = dwStartCylinder;
FormatParameters.EndCylinderNumber = dwStartCylinder + dwCylinderNumber - 1;
FormatParameters.StartHeadNumber = 0;
FormatParameters.EndHeadNumber = lpGeometry->TracksPerCylinder - 1;

dwBufSize = lpGeometry->TracksPerCylinder * sizeof(BAD_TRACK_NUMBER);

lpBadTrack = (PBAD_TRACK_NUMBER) new BYTE[dwBufSize];

// 用IOCTL_DISK_FORMAT_TRACKS对连续磁道进行低级格式化
bResult = ::DeviceIoControl(hDisk, // 设备句柄
IOCTL_DISK_FORMAT_TRACKS, // 低级格式化
&FormatParameters, sizeof(FormatParameters), // 输入数据缓冲区
lpBadTrack, dwBufSize, // 输出数据缓冲区
&dwOutBytes, // 输出数据长度
(LPOVERLAPPED)NULL); // 用同步I/O

delete lpBadTrack;

return bResult;
}
会思考的草 2003-09-30
  • 打赏
  • 举报
回复
没有API,必须使用DeviceIoControl
tanguangzhang 2003-09-30
  • 打赏
  • 举报
回复
我也找过,好像没有格式化硬盘的API函数啊!

16,466

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧