创建.exe的桌面快捷方式
大致分五步
1.获取快捷方式的起始位置(开始执行的位置)与目标位置(最终指向的exe全地址),可选获取图标地址,参数列表
2.获取创建实例,创建ShellLink对象并将1中属性赋予对象
3.通过ShellLink对象获取IPersistFile对象(用于将文件存储于磁盘)
4.通过给予save方法快捷方式的路径,将快捷方式创建于此。
5.释放资源(release)
下面直接贴代码~
//标准字符串转宽字符串
std::wstring s2ws(const std::string &s)
{
int len;
int slength = (int)s.length() + 1;
len = MultiByteToWideChar(CP_ACP, NULL, s.c_str(), slength, nullptr, 0);
wchar_t* buf = new wchar_t[len];
MultiByteToWideChar(CP_ACP, NULL, s.c_str(), slength, buf, len);
std::wstring r(buf);
delete[] buf;
return r;
}
//宽字符串转标准字符串
std::string ws2s(const std::wstring &s)
{
int len;
int slength = (int)s.length() + 1;
len = WideCharToMultiByte(CP_ACP, NULL, s.c_str(), slength, nullptr, 0, 0, 0);
char* buf = new char[len];
WideCharToMultiByte(CP_ACP, NULL, s.c_str(), slength, buf, len, 0, 0);
std::string r(buf);
delete[] buf;
return r;
}
/*
BOOL TestCreateDesktopShotCut(
wstring strName, //快捷方式名称
wstring strTargetPath, //快捷方式目标位置
wstring strIconPath //图标路径
wstring strArguments //参数设置
)
*/
BOOL CreateDesktopShortCut(int argc, char **argv)
{
if (FAILED(CoInitialize(NULL)))
return FALSE;
BOOL bRet = FALSE;
wstring strName = s2ws(argv[2]);
wstring strTargetPath = s2ws(argv[3]);
wstring strIconPath = s2ws(argv[4]);
wstring strArguments = s2ws(argv[5]);
TCHAR Path[MAX_PATH+1];
wstring strDestDir;
LPITEMIDLIST pidl;
LPMALLOC pShell;
if(SUCCEEDED(SHGetMalloc(&pShell))) //获取内存控制指针pShell
{
if(SUCCEEDED(SHGetSpecialFolderLocation(NULL,CSIDL_DESKTOPDIRECTORY,&pidl)))
{
if(!SHGetPathFromIDList(pidl,Path))
{
pShell->Free(pidl);
}
pShell->Release();
strDestDir = stringformatW(L"%s\\%s.lnk",Path,strName.c_str());
TRACKINFO("strDestDir = %s\r\n",strDestDir.c_str());
IShellLink* psl;
//获取ShellLink指针
if(SUCCEEDED(CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (LPVOID*)&psl)))
{
psl->SetPath(strTargetPath.c_str()); //设置快捷方式的目标位置
psl->SetWorkingDirectory(strTargetPath.c_str()); //设置快捷方式的起始位置(暂时设为目标位置)
psl->SetIconLocation(strIconPath.c_str(), 0); //设置图标路径
psl->SetArguments(strArguments.c_str()); //设置参数
TRACKINFO("strTargetPath = %s,strArguments = %s\r\n",strTargetPath.c_str(),strArguments.c_str());
IPersistFile* ppf;
if(SUCCEEDED(psl->QueryInterface(IID_IPersistFile,(LPVOID*)&ppf)))
{
if(SUCCEEDED(ppf->Save(strDestDir.c_str(),TRUE)))//保存快捷方式到桌面
{
bRet = TRUE;
system(ws2s(strDestDir.c_str()).c_str()); //启动该快捷方式
}
}
ppf->Release();
psl->Release();
}
}
}
CoUninitialize();
return bRet;
}