现在的位置: 首页 > 综合 > 正文

【COM/ATL】创建Url快捷方式

2018年07月07日 ⁄ 综合 ⁄ 共 1973字 ⁄ 字号 评论关闭

需要实现创建.url快捷方式的功能,网上看了一下,几乎都是通过写ini文件的方式做的,不得不说,这种方式简单有效。

但是对于有点强迫症的我来说,还是想通过API这种比较正规的方式去做,于是查了一下相关资料

微软已经提供了对应的COM接口来做这个事。

#include "stdafx.h"
#include <iostream>
#include <windows.h>
#include <IntShCut.h>
#include <ShlObj.h>
#include <propvarutil.h>

#pragma comment(lib, "shlwapi.lib")

void CreateInternetShortcut(LPCWSTR destUrl, LPCWSTR destFile)
{
	CoInitialize(nullptr);

	IUniformResourceLocatorW *url = nullptr;
	if (SUCCEEDED(CoCreateInstance(CLSID_InternetShortcut, nullptr, CLSCTX_INPROC_SERVER, IID_IUniformResourceLocatorW, (LPVOID*)&url)))
	{
		if (SUCCEEDED(url->SetURL(destUrl, IURL_SETURL_FL_GUESS_PROTOCOL)))
		{
			IPropertySetStorage *pss = nullptr;
			if (SUCCEEDED(url->QueryInterface(IID_IPropertySetStorage, (void**)&pss)))
			{
				IPropertyStorage *ps = nullptr;
				if (SUCCEEDED(pss->Open(FMTID_Intshcut, STGM_WRITE, &ps)))
				{
					// 设置两个属性,一个图标文件路径,一个图标索引
					PROPSPEC pids[2] = { { PRSPEC_PROPID, PID_IS_ICONFILE }, { PRSPEC_PROPID, PID_IS_ICONINDEX } };
					PROPVARIANT pvar[2];

					// 图标文件指向Windows自带记事本
					InitPropVariantFromString(L"C:\\Windows\\notepad.exe", &pvar[0]);
					
					// 图标索引设置为1,也就是第一个图标
					InitPropVariantFromInt16(0, &pvar[1]);

					ULONG n = sizeof(pids) / sizeof(pids[0]);

					// 写入属性
					ps->WriteMultiple(n, pids, pvar, 0);

					// 提交修改
					ps->Commit(STGC_DEFAULT);

					ps->Release();
					PropVariantClear(&pvar[0]);
					PropVariantClear(&pvar[1]);
				}
				pss->Release();
			}

			IPersistFile *pf = nullptr;
			if (SUCCEEDED(url->QueryInterface(IID_IPersistFile, (void**)&pf)))
			{
				pf->Save(destFile, TRUE);
				pf->Release();
			}
		}
		url->Release();
	}

	CoUninitialize();
}

int _tmain(int argc, _TCHAR* argv[])
{
	CreateInternetShortcut(L"http://blog.csdn.net/aqtata", L"C:\\Demo.url");
	system("pause");
	return 0;
}

因为COM的知识点比较多,对于上面的代码就没有详细说明了,只把关键设置属性的几个地方注释了一下
运行后会在C盘根目录下创建一个.url快捷方式,图标使用windows的记事本。

Win7 x64产生的.url文件内容:

[{000214A0-0000-0000-C000-000000000046}]
Prop3=19,2
[InternetShortcut]
URL=http://blog.csdn.net/aqtata
IDList=
IconFile=C:\Windows\notepad.exe
IconIndex=0

而在XP SP3下创建是这样的:

[InternetShortcut]
URL=http://blog.csdn.net/aqtata
Modified=70A1A2BF988BCF0165

是的,属性压根就没写进去,不知道是什么原因造成的,如果你知道了,请告诉我。^_^

参考资料:http://msdn.microsoft.com/en-us/library/bb776784(v=vs.85).aspx

抱歉!评论已关闭.