比較常見的例子是像文字編輯,自己軟體通常有個可以輸入的顯示視窗就不太想多做一些有的沒有的功能了,因為再怎樣好,應該也好不過UltraEdit。於是有些軟體可以指定用哪支軟體來開啟編輯,流程大概像這樣,有點像是右鍵開啟檔案的感覺:
- 首先判斷是不是已經指定了開啟檔案
- 如果沒有就開啟對話框,由使用者自行指定檔案
- 將指定的檔案路徑儲存起來
- 將畫面資料存成暫存檔
- 利用剛剛的檔案路徑,把暫存檔案當參數,用指令打開
我要說的是第二種情況,假設已經指定好要用何種程式開啟。這種比較複雜一點。流程圖如下:
- 列出所有系統中安裝過的程式(HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall)
- 如果有找到的話,去自動找出在系統中的安裝路徑(Software\\Microsoft\\Windows\\CurrentVersion\\App Paths\\)
- 後面就和上面的步驟4.5一樣
這邊舉文字編輯當作例子,預設開啟的程式為「Notepad++」,所以在程式中,我需要先去列舉所有安裝的程式出來比對,看裡頭是否有Notepad++的字樣,有的話就表示安裝過。但我沒有寫如果未安裝的情況。底下為Microsoft VC++的例子:
#define IS_KEY _T("Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall") if (::RegOpenKeyEx(HKEY_LOCAL_MACHINE, IS_KEY, 0, KEY_READ, &hKey) != ERROR_SUCCESS) return; while ((lRet = ::RegEnumKeyEx(hKey, dwIndex, szSubKeyName, &cbName, NULL, NULL, NULL, NULL)) != ERROR_NO_MORE_ITEMS) { if (lRet == ERROR_SUCCESS) { HKEY hItem; if (::RegOpenKeyEx(hKey, szSubKeyName, 0, KEY_READ, &hItem) != ERROR_SUCCESS) continue; if (::RegQueryValueEx(hItem, IS_DISPLAY, NULL, &dwType, (LPBYTE)&szDisplayName, &dwSize) == ERROR_SUCCESS) { CString tmpS(szDisplayName); // Add to the main array if(tmpS.Find("Notepad++") >= 0) { isFind = true; } } ::RegCloseKey(hItem); dwIndex++; cbName = IS_KEY_LEN; } ::RegCloseKey(hKey);
#define IS_INSTALL_PATH _T("Software\\Microsoft\\Windows\\CurrentVersion\\App Paths\\notepad++.exe") if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,IS_INSTALL_PATH,0,KEY_QUERY_VALUE,&hKey)!=ERROR_SUCCESS) return; DWORD Length = IS_KEY_LEN; if(RegQueryValueEx(hKey,NULL,0,NULL,(LPBYTE)szSubKeyName, &Length)!=ERROR_SUCCESS) { RegCloseKey(hKey); return; } RegCloseKey(hKey);
接者是另存一個暫存檔之後,把暫存檔和路徑綁在一起,一同執行,就好像在console中輸入「notepad++.exe temp.txt」一樣的意思,就可以開啟檔案了。
我這邊存檔方式是去CEdit中一行一行抓出,寫入。最後成果就像下圖一樣,如果Editor有幫我分類分析功能,叫他出來呈現好看多了:ShellExecute(NULL, "open", szSubKeyName, "temp.txt", NULL, SW_SHOW );
AssignEditor.7z
0 意見:
張貼留言