1. 程式人生 > >3.COM使用例項——快捷方式建立和解析

3.COM使用例項——快捷方式建立和解析

平常我們操作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物件,不需要關心具體實現的位置和細節,類似功能的介面可以互查。

完整程式碼下載連結