2014年12月8日 星期一

獲取 windows 上安裝的所有 browser

上頭丟了一個奇怪的需求, 說我們軟件開啟的網頁要能指定 browser.

當下只有 囧 可以形容.


要知道什麼軟件是瀏覽器, 目前大概只能針對已知的 browser 個別處理.

首先要做的是就是先獲取 browser 執行檔的路徑.

所有 browser 安裝後一定會產生 Shortcut, 從 Shortcut 取得就ok了

1. 所以先取得所有 *.lnk 在 start menu下的.

wchar_t szPath[MAX_PATH];
CFileInfoList files;

memset(szPath, 0x00, sizeof(szPath));
if (SHGetSpecialFolderPathW(NULL, szPath, CSIDL_PROGRAMS, false))
{
    files.GetFolderInfo(szPath);
}

memset(szPath, 0x00, sizeof(szPath));
if (SHGetSpecialFolderPathW(NULL, szPath, CSIDL_COMMON_PROGRAMS, false))
{
   files.GetFolderInfo(szPath);

}

2. 接著寫取得快捷路徑的方法:
BOOL GetShortcutTarget(const wchar_t *file, CString &szTarget)
{
    HRESULT hr;
    IShellLinkW *pLink;  //IShellLink对象指针
    IPersistFile *ppf;  //IPersisFil对象指针
    wchar_t szPah[MAX_PATH];
    WIN32_FIND_DATAW FileData;

    szTarget.Empty();

    hr = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLinkW, (void**)&pLink);
    if (FAILED(hr))
    {
        SAVELOG_DANGER("CoCreateInstance failed");
        return FALSE;
    }

    //从IShellLink对象中获取IPersistFile接口
    hr = pLink->QueryInterface(IID_IPersistFile, (void**)&ppf); 
    if (FAILED(hr)) 
    {
        SAVELOG_DANGER("QueryInterface failed");
        pLink->Release(); 
        return FALSE; 
    }

    // open Shortcut
    hr = ppf->Load(file, STGM_READ);
    if (SUCCEEDED(hr))
    {
        memset(szPah, 0x00, sizeof(szPah));
        hr = pLink->GetPath(szPah, MAX_PATH, &FileData, SLGP_SHORTPATH);
        if (SUCCEEDED(hr))
        {
            szTarget = szPah;
        }
    }

    ppf->Release(); 
    pLink->Release();
    return SUCCEEDED(hr);
}


3. 針對特定名稱快捷取路徑
Internet Explorer.lnk
Mozilla Firefox.lnk
Waterfox.lnk
Navigator.lnk
Pale Moon.lnk
SeaMonkey.lnk
Google Chrome.lnk
Safari.lnk
Opera.lnk

4. 針對 Safari 處理
   Safari 的快捷長的不大一樣, 所以取不到路徑, 改成取 Working Directory 並加檔案名稱

BOOL GetShortcutWorkDirectory(const wchar_t *file, CString &szDir)
{
    HRESULT hr;
    IShellLinkW *pLink;  //IShellLink对象指针
    IPersistFile *ppf;  //IPersisFil对象指针
    wchar_t szPah[MAX_PATH];
    WIN32_FIND_DATAW FileData;

    szDir.Empty();

    hr = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLinkW, (void**)&pLink);
    if (FAILED(hr))
    {
        SAVELOG_DANGER("CoCreateInstance failed");
        return FALSE;
    }

    //从IShellLink对象中获取IPersistFile接口
    hr = pLink->QueryInterface(IID_IPersistFile, (void**)&ppf);
    if (FAILED(hr))
    {
        SAVELOG_DANGER("QueryInterface failed");
        pLink->Release();
        return FALSE;
    }

    // open Shortcut
    hr = ppf->Load(file, STGM_READ);
    if (SUCCEEDED(hr))
    {
        memset(szPah, 0x00, sizeof(szPah));
        hr = pLink->GetWorkingDirectory(szPah, MAX_PATH);
        if (SUCCEEDED(hr))
        {
            szDir = szPah;
        }
    }

    ppf->Release();
    pLink->Release();
    return SUCCEEDED(hr);
}


5. 最後成果

    // define by windows
    unit = new CBrowserList::CBrowserInfo();
    unit->m_Name = PTwcsdup(g_Language.GetString("default", "Default"));
    unit->m_Path = PTwcsdup(L"");
    this->m_list.Add(unit);

    memset(szPath, 0x00, sizeof(szPath));
    if (SHGetSpecialFolderPathW(NULL, szPath, CSIDL_PROGRAMS, false))
    {
        files.GetFolderInfo(szPath);
        for (i=0; i<files.Count(); i++)
        {
            _GetFileName(files[i]->fullName, FileName);
            if (0 == FileName.CompareNoCase(L"Internet Explorer.lnk"))
            {
                if (GetShortcutTarget(files[i]->fullName, Target))
                {
                    unit = new CBrowserList::CBrowserInfo();
                    unit->m_Name = PTwcsdup(L"Internet Explorer");
                    unit->m_Path = PTwcsdup(Target);
                    this->m_list.Add(unit);               
                }

            }
        }
    }

    memset(szPath, 0x00, sizeof(szPath));
    if (SHGetSpecialFolderPathW(NULL, szPath, CSIDL_COMMON_PROGRAMS, false))
    {
        files.GetFolderInfo(szPath);
        for (i=0; i<files.Count(); i++)
        {
            _GetFileName(files[i]->fullName, FileName);
            if (0 == FileName.CompareNoCase(L"Mozilla Firefox.lnk"))
            {
                if (GetShortcutTarget(files[i]->fullName, Target))
                {
                    unit = new CBrowserList::CBrowserInfo();
                    unit->m_Name = PTwcsdup(L"Mozilla Firefox");
                    unit->m_Path = PTwcsdup(Target);
                    this->m_list.Add(unit);                   
                }

            }
            else if (0 == FileName.CompareNoCase(L"Waterfox.lnk"))
            {
                if (GetShortcutTarget(files[i]->fullName, Target))
                {
                    unit = new CBrowserList::CBrowserInfo();
                    unit->m_Name = PTwcsdup(L"Waterfox");
                    unit->m_Path = PTwcsdup(Target);
                    this->m_list.Add(unit);                   
                }      
     
            }
            else if (0 == FileName.CompareNoCase(L"Navigator.lnk"))
            {
                if (GetShortcutTarget(files[i]->fullName, Target))
                {
                    unit = new CBrowserList::CBrowserInfo();
                    unit->m_Name = PTwcsdup(L"Navigator");
                    unit->m_Path = PTwcsdup(Target);
                    this->m_list.Add(unit);                   
                }           

            }
            else if (0 == FileName.CompareNoCase(L"Pale Moon.lnk"))
            {
                if (GetShortcutTarget(files[i]->fullName, Target))
                {
                    unit = new CBrowserList::CBrowserInfo();
                    unit->m_Name = PTwcsdup(L"Pale Moon");
                    unit->m_Path = PTwcsdup(Target);
                    this->m_list.Add(unit);                   
                }   
        
            }
            else if (0 == FileName.CompareNoCase(L"SeaMonkey.lnk"))
            {
                if (GetShortcutTarget(files[i]->fullName, Target))
                {
                    unit = new CBrowserList::CBrowserInfo();
                    unit->m_Name = PTwcsdup(L"SeaMonkey");
                    unit->m_Path = PTwcsdup(Target);
                    this->m_list.Add(unit);                   
                } 
          
            }
            else if (0 == FileName.CompareNoCase(L"Google Chrome.lnk"))
            {
                if (GetShortcutTarget(files[i]->fullName, Target))
                {
                    unit = new CBrowserList::CBrowserInfo();
                    unit->m_Name = PTwcsdup(L"Google Chrome");
                    unit->m_Path = PTwcsdup(Target);
                    this->m_list.Add(unit);                  
                }

            }
            else if (0 == FileName.CompareNoCase(L"Safari.lnk"))
            {
                if (GetShortcutWorkDirectory(files[i]->fullName, Target))
                {
                    unit = new CBrowserList::CBrowserInfo();
                    unit->m_Name = PTwcsdup(L"Safari");
                    unit->m_Path = PTwcsdup(Target);
                    unit->m_Path = PTwcscat(unit->m_Path, L"Safari.exe");
                    this->m_list.Add(unit);                   
                }

            }
            else if (0 == FileName.CompareNoCase(L"Opera.lnk"))
            {
                if (GetShortcutTarget(files[i]->fullName, Target))
                {
                    unit = new CBrowserList::CBrowserInfo();
                    unit->m_Name = PTwcsdup(L"Opera");
                    unit->m_Path = PTwcsdup(Target);
                    this->m_list.Add(unit);                
                }

            }
        }
    }


6. 呼叫
void openURL(const wchar_t *url)
{
    if (g_SettingsInfo.Browser.IsEmpty())
    {
        ShellExecuteW(NULL, L"open", url, NULL, NULL, SW_SHOWNORMAL);
        return;
    }
    // check Browser was exist
    if (FileExists(g_SettingsInfo.Browser.GetString()))
    {
        ShellExecuteW(NULL, NULL, g_SettingsInfo.Browser.GetString(), url, NULL, SW_SHOWNORMAL);
        return;
    }
    //
    ShellExecuteW(NULL, _T("open"), url, NULL, NULL, SW_SHOWNORMAL);
}


沒有留言:

張貼留言