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