需要实现创建.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://www.qt6.com", 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
版权声明:本文为aqtata原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。