3.COM使用实例——快捷方式创建和解析

发布时间:2017-6-29 10:43:36
来源:分享查询网

平常我们操作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对象,不需要关心具体实现的位置和细节,类似功能的接口可以互查。


完整代码下载链接

原创,转载请注明来自http://blog.csdn.net/wenzhou1219


返回顶部
查看电脑版