Я пытаюсь программно создать ссылку на оболочку, т.е. ярлык.В Visual Studio C ++.
Ярлык создан, и он работает.Но значок является значком по умолчанию (поскольку предоставленный значок не был принят во внимание API).Читая документы, кажется, что я должен предоставить значок index .Но что это?На данный момент существует только файл .ico.
Вот код (см. ### строки)
#include "stdafx.h"
#include <iostream>
#include <string>
#include <ShlObj.h>
class MakeLnk
{
public:
MakeLnk(){}
void SetLnkInfos
(
std::wstring i_target,
std::wstring i_args,
std::wstring i_savePath,
std::wstring i_description,
std::wstring i_icoloc
)
{
target = i_target;
args = i_args;
savePath = i_savePath;
description = i_description;
icolocation = i_icoloc;
}
// Utility function, to create a link
HRESULT CreateLnk()
{
LPCWSTR lpszPathObj = target.c_str();
LPCTSTR arguments = args.c_str();
LPCWSTR lpszLinkPath = savePath.c_str();
LPCWSTR lpszDesc = description.c_str();
// ##########################
LPCWSTR lpszIcoPath = icolocation.c_str(); // a path like "C:\\tmp\\crab.ico"
// ##########################
HRESULT hres;
IShellLink* psl;
CoInitialize(NULL);
// Get a pointer to the IShellLink interface. It is assumed that CoInitialize
// has already been called.
hres = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (LPVOID*)&psl);
if (SUCCEEDED(hres))
{
IPersistFile* ppf;
// Set the path to the shortcut target and add description and args.
psl->SetPath(lpszPathObj);
psl->SetDescription(lpszDesc);
psl->SetArguments(arguments);
// ###############################################
psl->SetIconLocation(lpszIcoPath, 0); // HERE! WHAT TO PUT INSTEAD OF "0" ?
// ###############################################
// Query IShellLink for the IPersistFile interface, used for saving the
// shortcut in persistent storage.
hres = psl->QueryInterface(IID_IPersistFile, (LPVOID*)&ppf);
if (SUCCEEDED(hres))
{
// Save the link by calling IPersistFile::Save.
hres = ppf->Save(lpszLinkPath, TRUE);
ppf->Release();
}
psl->Release();
}
CoUninitialize();
return hres;
}
private:
std::wstring target, args, savePath, description;
std::wstring icolocation;
};
int main()
{
MakeLnk linkMaker;
std::wstring exepath(L"C:\\Program Files\\Crab\\Exec.exe"), arguments(L"eat dance"), lnkPath(L"shortcut.lnk"), description(L"Click here to lanch the crab program"), icon(L"C:\\tmp\\crab.ico");
linkMaker.SetLnkInfos(exepath, arguments, lnkPath, description, icon);
bool res = linkMaker.CreateLnk();
return res ? 0 : -1;
}