3.COM使用例項——快捷方式建立和解析
阿新 • • 發佈:2019-01-23
平常我們操作Windows系統都是在資源管理器explorer.exe中,微軟提供了COM介面供我們操作和擴充套件資源管理器行為。實際上微軟的很多介面是通過COM來開放的,COM已經成為Windows系統事實上的介面標準了。上節介紹如何編寫最簡單的COM,本節通過[快捷方式建立和解析]看下如何使用COM呼叫Windows相關功能。
1.建立快捷方式
//功能:建立快捷方式 //引數:pszShortCut—快捷方式名稱,lpss-快捷方式引數 HRESULT SHCreateShortcutEx(LPTSTR pszShortCut, LPSHORTCUTSTRUCT lpss) { if (lpss == NULL) { return E_FAIL; } IShellLink* pShellLink = NULL; IPersistFile* pPersistFile = NULL; //記憶體中建立快捷方式 HRESULT hr = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, reinterpret_cast<LPVOID*>(&pShellLink)); if (FAILED(hr)) { return hr; } pShellLink->SetPath(lpss->pszTarget); pShellLink->SetDescription(lpss->pszDescription); pShellLink->SetHotkey(lpss->wHotkey); pShellLink->SetIconLocation(lpss->pszIconPath, lpss->wIconIndex); //儲存到磁碟上 hr = pShellLink->QueryInterface(IID_IPersistFile, reinterpret_cast<LPVOID*>(&pPersistFile)); if (FAILED(hr)) { pShellLink->Release(); return hr; } hr = pPersistFile->Save(pszShortCut, TRUE); pShellLink->Release(); pPersistFile->Release(); return hr; }
2.解析快捷方式
//功能:解析快捷方式 //引數:pszShortCut—解析快捷方式,lpss-解析出的快捷方式引數 HRESULT SHResolveShortcut(LPTSTR pszShortCut, LPSHORTCUTSTRUCT lpss) { if (lpss == NULL) { return E_FAIL; } IShellLink* pShellLink = NULL; IPersistFile* pPersistFile = NULL; HRESULT hr = E_FAIL; do { //獲取操作介面 hr = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, reinterpret_cast<LPVOID*>(&pShellLink)); if (FAILED(hr)) { break; } hr = pShellLink->QueryInterface(IID_IPersistFile, reinterpret_cast<LPVOID*>(&pPersistFile)); if (FAILED(hr)) { break; } //載入快捷方式到記憶體Storage hr = pPersistFile->Load(pszShortCut, STGM_READ); if (FAILED(hr)) { break; } //解析快捷方式 hr = pShellLink->Resolve(NULL, SLR_ANY_MATCH); if (FAILED(hr)) { break; } WIN32_FIND_DATA fd; //匯出資訊 pShellLink->GetPath(lpss->pszTarget, MAX_PATH, &fd, SLGP_SHORTPATH); pShellLink->GetDescription(lpss->pszDescription, MAX_PATH); pShellLink->GetHotkey(&lpss->wHotkey); pShellLink->GetIconLocation(lpss->pszIconPath, MAX_PATH, &lpss->wIconIndex); } while(false); if(pShellLink) { pShellLink->Release(); } if(pPersistFile) { pPersistFile->Release(); } return hr; }
可以看到操作COM介面很簡單,建立對應的COM物件,不需要關心具體實現的位置和細節,類似功能的介面可以互查。
完整程式碼下載連結