1. 程式人生 > 實用技巧 >CFormatDriveDialog -沒有文件說明的SHFormatDrive API函式的包裝類

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