• 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

  • 相关阅读:
    实例讲解如何在Delphi中动态创建dxBarManager内容
    SqlServer中创建Oracle连接服务器
    Delphi中的四舍五入函数
    Delphi中的四舍五入函数
    垃圾回收内存管理
    列表生成式
    列表函数&方法
    python切片
    python函数def
    Python 控制流、列表生成式
  • 原文地址:https://www.cnblogs.com/Dincat/p/13457982.html
Copyright © 2020-2023  润新知