需要实现创建.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