[C++]用某某程式開啟檢視.編輯

因為老闆的一個突發奇想,以及為了簡化使用者的操作步驟,有一些軟體在編輯或是檢視的時候,可以呼叫另一個編輯器來編輯,編輯完之後再回貼至原本程式的畫面。假設我用capture方法抓了一些網路封包,但我只是列出,不想寫parser分析是哪種封包,我就會去呼叫wireshark幫我去分析。好處是利用比較好用的編輯軟體,達(掩)到(飾)更(自)好(已)的體(不)驗(足)。

比較常見的例子是像文字編輯,自己軟體通常有個可以輸入的顯示視窗就不太想多做一些有的沒有的功能了,因為再怎樣好,應該也好不過UltraEdit。於是有些軟體可以指定用哪支軟體來開啟編輯,流程大概像這樣,有點像是右鍵開啟檔案的感覺:
  1. 首先判斷是不是已經指定了開啟檔案
  2. 如果沒有就開啟對話框,由使用者自行指定檔案
  3. 將指定的檔案路徑儲存起來
  4. 將畫面資料存成暫存檔
  5. 利用剛剛的檔案路徑,把暫存檔案當參數,用指令打開
我要說的是第二種情況,假設已經指定好要用何種程式開啟。這種比較複雜一點。流程圖如下:
  1. 列出所有系統中安裝過的程式(HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall)
  2. 如果有找到的話,去自動找出在系統中的安裝路徑(Software\\Microsoft\\Windows\\CurrentVersion\\App Paths\\)
  3. 後面就和上面的步驟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」一樣的意思,就可以開啟檔案了。

ShellExecute(NULL, "open", szSubKeyName, "temp.txt", NULL, SW_SHOW );

我這邊存檔方式是去CEdit中一行一行抓出,寫入。最後成果就像下圖一樣,如果Editor有幫我分類分析功能,叫他出來呈現好看多了:


--完整Source Code(VC++ 2008 vaildated)--
AssignEditor.7z


0 意見:

搜尋此網誌

總網頁瀏覽量

TK呱呱

Made with by TK