CFormatDriveDialog -没有文档说明的SHFormatDrive API函数的包装类

概述 这门课基本上打开窗户磁盘格式对话框。你会有 认为它会成为通用对话框的一部分了。更糟糕的是 KB文章中,一些信息Q173688现在是不正确的的 Windows XP和Windows 2000。我推测知识库文章 写在9 x天,他们忘了删除或更新。什么 我困惑的是知识库article 状态的信息 适用于XP和2 k。我首先感到震惊的发现 快速格式化选项表现完全相反的它是如何描述的KB 篇文章。除了Make-system-disk选项甚至没有正常工作。 无论如何我写一个类,CFormatDriveDialog基本上包裹的东西 给你。我已经坚持推荐女士常数定义他们 工作,但在其他情况下我丢弃他们或者添加自己的。 强烈的警告 KB文章中的信息Q173688部分是不正确的。不遵循 盲目地如果你打算建立在这个类。还请注意,这类 只能用在Win2K / XP系统。知识库文章随访 旧的操作系统版本9 x和我。 类引用 这里有一个公共方法(当然,除了 parameter-less构造函数)。 DoModal 隐藏,复制Code

int CFormatDriveDialog::DoModal(HWND hWnd, UINT Drive, bool 
bQuickFormat, LPCTSTR vol_label);

hWnd,对话框的父窗口句柄。这是不可能的 NULL。驱动的驱动代码(0,1 B 2 C等等)我 像DRIVEA定义常量,DRIVEB DRIVEC 等等,你可以使用,而不是原始数据。他们是在标题中定义 文件。bQuickFormat——如果真的那么“快速格式化”复选框标记 违约。vol_label——默认值的卷标 使用。 返回值 如果成功的格式完成和IDCANCEL IDOK 如果格式操作被取消或者一些错误发生。 示例使用 隐藏,复制Code

void Cnish_testDlg::OnBnClickedButton1()
{
    UpdateData(true);
    CFormatDriveDialog dlg;
    int d=dlg.DoModal(AfxGetMainWnd()->m_hWnd,DRIVEA,
        bQuickFormat,m_vollab);
    if(d==IDOK)
        MessageBox("yeah"); 
}

技术细节 我们从二调用SHFormatDrive函数。我使用 LoadLibrary和 负载二,然后调用GetProcAddress SHFormatDrive地址。我 还使用SetWindowsHookEx设置CBT钩,因为我们需要设置音量 标签。钩proc调用EnumChildWindows当我们遇到子窗口 “编辑”类,我们知道这是卷标编辑框,因为 只在对话框编辑框。请参考详细的源代码。一个剪掉 部分下面的清单给出评论中没有实际的来源 代码。 隐藏,收缩,复制Code

int CFormatDriveDialog::DoModal(...)
{

    //...

    // Function pointer to hold SHFormatDrive
    FMTDRIVEFUNC* pshfd;

    // Load the dll
    HMODULE hMod = LoadLibrary("shell32.dll");

    // Chk for error - just in case
    if(hMod)
    {
        // Assign function pointer
        pshfd = reinterpret_cast<FMTDRIVEFUNC*>
            (GetProcAddress(hMod,"SHFormatDrive"));

        // Set a WH_CBT hook
        m_hHook = SetWindowsHookEx(WH_CBT,CBTProc,
            AfxGetApp()->m_hInstance,AfxGetApp()->m_nThreadID);

        // Call the function via the function pointer
        rv = ((*pshfd)(hWnd,Drive,SHFMT_ID_DEFAULT,Options)==
            SHFMT_FMTSUCCESS) ? IDOK : IDCANCEL;

        // Free the dll
        FreeLibrary(hMod);
    }
    
    //...
}

LRESULT CALLBACK CFormatDriveDialog::CBTProc(...)
{
    if (nCode == HCBT_ACTIVATE )
    { 
        // Get handle of Format dialog
        HWND hWnd = reinterpret_cast<HWND>(wParam);

        // Enumerate all child windows to get 
        // volume label the edit box
        EnumChildWindows(hWnd,EnumChildProc,NULL); 

        // Finished our need for the hook
        UnhookWindowsHookEx(m_hHook);
        CFormatDriveDialog::m_hHook = NULL; 
    }
    return FALSE;
}

BOOL CALLBACK CFormatDriveDialog::EnumChildProc(...)
{ 
    char buff[256];
    GetClassName(hwnd,buff,255);

    // The vol label edit box is the only edit control
    if(strcmp(buff,"Edit")==0)
    {
        SetWindowText(hwnd,m_vol_label);
        return FALSE;
    }
    return TRUE;
}

结论 有几个返回代码和选项代码上面提到的 提到KB文章。但没有一个像预期的那样工作,他们中的一些人不喜欢 在所有的工作。除了代码常数给出快速格式化的工作 完全相反的态度。当然我基地尝试的结果代码 我自己的机器是XP专业盒子。我也得到了詹姆斯·T·约翰逊 测试部分在XP专业箱和Smitha(翠迪)来测试它 她的Windows 2000专业盒子。但是我不知道这个类将是如何工作的 在未经测试的操作系统版本有或没有服务包。 本文转载于:http://www.diyabc.com/frontweb/news2537.html

原文地址:https://www.cnblogs.com/Dincat/p/13457982.html