HRESULT CreateShellLink(PCWSTR pszArguments, PCWSTR pszTitle, int iconIndex, IShellLink **ppsl) { ATL::CComPtr<IShellLink> psl; HRESULT hr = psl.CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER); if (FAILED(hr)) return hr; WCHAR szAppPath[MAX_PATH]; if (GetModuleFileName(NULL, szAppPath, _countof(szAppPath)) == 0) { hr = HRESULT_FROM_WIN32(GetLastError()); return hr; } hr = psl->SetPath(szAppPath); if (FAILED(hr)) return hr; hr = psl->SetArguments(pszArguments); if (FAILED(hr)) return hr; hr = psl->SetIconLocation(szAppPath, iconIndex); if (FAILED(hr)) return hr; ATL::CComPtr<IPropertyStore> pps; hr = psl.QueryInterface(&pps); if (FAILED(hr)) return hr; PROPVARIANT propvar; hr = InitPropVariantFromString(pszTitle, &propvar); if (SUCCEEDED(hr)) { hr = pps->SetValue(PKEY_Title, propvar); if (SUCCEEDED(hr)) { hr = pps->Commit(); if (SUCCEEDED(hr)) { hr = psl.QueryInterface(ppsl); } } PropVariantClear(&propvar); } return hr; }
HRESULT CreateSeparatorLink(IShellLink **ppsl) { ATL::CComPtr<IPropertyStore> pps; HRESULT hr = pps.CoCreateInstance(CLSID_ShellLink, nullptr, CLSCTX_INPROC_SERVER); if (FAILED(hr)) return hr; PROPVARIANT propvar; hr = InitPropVariantFromBoolean(TRUE, &propvar); if (FAILED(hr)) return hr; hr = pps->SetValue(PKEY_AppUserModel_IsDestListSeparator, propvar); if (SUCCEEDED(hr)) { hr = pps->Commit(); if (SUCCEEDED(hr)) { hr = pps.QueryInterface(ppsl); } } PropVariantClear(&propvar); return hr; }