я переделал функцию Pu таким образом (работает, тестировал)
Вопрос по закомментированной части в конце кода - ярлык работает и без этого куска. Я так и не понял, что сей кусок делает ?
#include <objbase.h>
#define _WIN32_IE 0x0700
#include <shlobj.h>
#include <vector>
//location задаёт путь , где ярлык будет лежать.
//если location==0, для нахождения пути будет использован
//параметр or_location в вызове SHGetSpecialFolderLocation
void CreateLinkThenChangeIcon(
const char* filepath,
const char* linkname,
const char* location=0,
WORD or_location=CSIDL_DESKTOP,
const char* shell32_dll="shell32.dll")
{
CoInitialize(0);
HRESULT hres=0;
IShellLink* psl=0;
IPersistFile* pPf=0;
std::vector<wchar_t> wsz;//(MAX_PATH ,0);
std::vector<char> buf;//(MAX_PATH ,0);
int id=0;
LPITEMIDLIST pidl=0;
hres=CoCreateInstance(CLSID_ShellLink,0,CLSCTX_INPROC_SERVER,IID_IShellLink,(LPVOID*)&psl);
for(;;)
{
if(FAILED(hres))break;
hres = psl->QueryInterface(IID_IPersistFile, (LPVOID*)&pPf);
if(FAILED(hres))break;
hres = psl->SetPath(filepath);
if(FAILED(hres))break;
if(location)
{
buf.insert(buf.end(),location,location+strlen(location));//без 0
}
else
{
SHGetSpecialFolderLocation(0, or_location, &pidl);
buf.resize(MAX_PATH,0);
SHGetPathFromIDList(pidl, &buf[0]);
buf[buf.size()-1]=0;
buf.resize(strlen(&buf[0]));//без 0
}
buf.push_back('\\');
buf.insert(buf.end(),linkname,linkname+strlen(linkname)+1);//с 0
if(!buf.size())break;
wsz.resize(MAX_PATH,0);
MultiByteToWideChar(CP_ACP, 0, &buf[0], -1, &wsz[0], min(buf.size(),wsz.size()));
wsz[wsz.size()-1]=0;
hres = pPf->Save(&wsz[0], 1);
if(FAILED(hres))break;
/*
GetSystemDirectory(&buf[0], buf.size());
buf[buf.size()-1]=0;
buf.resize(strlen(&buf[0]));//без 0
buf.push_back('\\');
if(shell32_dll)
{
buf.insert(buf.end(),shell32_dll,shell32_dll+strlen(shell32_dll)+1);//с 0
}
hres = psl->SetIconLocation(&buf[0], 1);
if(FAILED(hres))break;
hres = psl->GetIconLocation(&buf[0], buf.size(), &id);
if(FAILED(hres))break;
buf[buf.size()-1]=0;
buf.resize(strlen(&buf[0]));//без 0
pPf->Save(&wsz[0], 1);
*/
break;
}
if(pPf)pPf->Release();
if(psl)psl->Release();
}