最近的工程中要用到了vc中關於檔案關聯的操作,費了不少周折,這裡就簡單做一個小結。
(1)使用EnableShellOpen自動完成註冊表的註冊資訊
這種情況下,只需要在CWinApp子類的InitInstance函數中添加如下代碼就行
// Enable DDE Execute open
EnableShellOpen();
RegisterShellFileTypes(TRUE);
通常情況下,也有加上這句的必要
// Enable drag/drop open
m_pMainWnd->DragAcceptFiles();
下面以MDI為例,說明幾個需要注意的地方:
一、需要修改string table中的IDR_FFTYPE值,來定義預設的文件類型,如
/nFf/nFf/nFf 檔案 (*.ff)/n.ff/nFf.Document/nFf Document
其中第三個參數是在開啟/儲存對話方塊中檔案類型顯示的提示資訊,第四個參數是你自訂的檔案類型的尾碼名稱。
二、也可以在程式產生嚮導的第四步中定義你的文件類型,而不需要再進行上面“一”的操作。
三、不同的工程最好是定義不同的自訂檔案類型,否則同一個檔案類型在註冊表中可能會產生資料混亂的現象,從而可能導致程式的不正常關聯。
四、若要自訂自己的關聯程式的表徵圖,第一步需要將自訂的ico檔案覆蓋掉res檔案夾下預設的IDR_FFTYPE對應的資源檔;第二步,刪除工程目錄下的aps檔案,清空二進位備份,重新載入工程即可。
(2)編輯一個註冊表檔案來實現關聯
REGEDIT
; This .REG file may be used by your SETUP program.
; If a SETUP program is not available, the entries below will be
; registered in your InitInstance automatically with a call to
; CWinApp::RegisterShellFileTypes and COleObjectFactory::UpdateRegistryAll.
HKEY_CLASSES_ROOT/.ff = Ff.Document
HKEY_CLASSES_ROOT/SingleInstMDI.Document/shell/open/command = ff.EXE %1
HKEY_CLASSES_ROOT/SingleInstMDI.Document/shell/open/ddeexec = [open("%1")]
HKEY_CLASSES_ROOT/SingleInstMDI.Document/shell/open/ddeexec/application = ff
; note: the application is optional
; (it defaults to the app name in "command")
HKEY_CLASSES_ROOT/Ff.Document = Ff Document
自訂一個reg檔案,內容類別似上面的描述。雙擊執行,匯入到自己機器的註冊表中去即可。