备注:可能会引起杀毒工具的误报,关掉杀毒软件就正常运行了。
#include <stdio.h>
#include <windows.h>#include <shlobj.h>
#pragma comment(lib, "shell32.lib")
//得到当前桌面路径
BOOL GetDesktopPath(char *pszDesktopPath)
{
LPITEMIDLIST ppidl = NULL;
if (SHGetSpecialFolderLocation(NULL, CSIDL_DESKTOP, &ppidl) == S_OK)
{
BOOL flag = SHGetPathFromIDList(ppidl, pszDesktopPath);
CoTaskMemFree(ppidl);
return flag;
}
return FALSE;
}
//得到快速启动栏的路径
BOOL GetIEQuickLaunchPath(char *pszIEQueickLaunchPath)
{
LPITEMIDLIST ppidl;
if (SHGetSpecialFolderLocation(NULL, CSIDL_APPDATA, &ppidl) == S_OK)
{
BOOL flag = SHGetPathFromIDList(ppidl, pszIEQueickLaunchPath);
strcat(pszIEQueickLaunchPath, "\\Microsoft\\Internet Explorer\\Quick Launch");
CoTaskMemFree(ppidl);
return flag;
}
return FALSE;
}
//得到 开始->程序组 的路径
BOOL GetProgramsPath(char *pszProgramsPath)
{
LPITEMIDLIST ppidl;
if (SHGetSpecialFolderLocation(NULL, CSIDL_PROGRAMS, &ppidl) == S_OK)
{
BOOL flag = SHGetPathFromIDList(ppidl, pszProgramsPath);
CoTaskMemFree(ppidl);
return flag;
}
return FALSE;
}
/*
函数功能:对指定文件在指定的目录下创建其快捷方式
函数参数:
lpszFileName 指定文件,为NULL表示当前进程的EXE文件。
lpszLnkFileDir 指定目录,不能为NULL。
lpszLnkFileName 快捷方式名称,为NULL表示EXE文件名。
wHotkey 为0表示不设置快捷键
pszDescription 备注
iShowCmd 运行方式,默认为常规窗口
*/
BOOL CreateFileShortcut(LPCSTR lpszFileName, LPCSTR lpszLnkFileDir, LPCSTR lpszLnkFileName, LPCSTR lpszWorkDir, WORD wHotkey,LPCTSTR lpszDescription, int iShowCmd = SW_SHOWNORMAL)
{
if (lpszLnkFileDir == NULL)
return FALSE;
HRESULT hr;
IShellLink *pLink; //IShellLink对象指针
IPersistFile *ppf; //IPersisFil对象指针
//创建IShellLink对象
hr = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (void**)&pLink);
if (FAILED(hr))
return FALSE;
//从IShellLink对象中获取IPersistFile接口
hr = pLink->QueryInterface(IID_IPersistFile, (void**)&ppf);
if (FAILED(hr))
{
pLink->Release();
return FALSE;
}
//目标
if (lpszFileName == NULL)
pLink->SetPath(_pgmptr);
else
pLink->SetPath(lpszFileName);
//工作目录
if (lpszWorkDir != NULL)
pLink->SetPath(lpszWorkDir);
//快捷键
if (wHotkey != 0)
pLink->SetHotkey(wHotkey);
//备注
if (lpszDescription != NULL)
pLink->SetDescription(lpszDescription);
//显示方式
pLink->SetShowCmd(iShowCmd);
//快捷方式的路径 + 名称
char szBuffer[MAX_PATH];
if (lpszLnkFileName != NULL) //指定了快捷方式的名称
sprintf(szBuffer, "%s\\%s", lpszLnkFileDir, lpszLnkFileName);
else
{
//没有指定名称,就从取指定文件的文件名作为快捷方式名称。
char *pstr;
if (lpszFileName != NULL)
pstr = strrchr(lpszFileName, '\\');
else
pstr = strrchr(_pgmptr, '\\');
if (pstr == NULL)
{
ppf->Release();
pLink->Release();
return FALSE;
}
//注意后缀名要从.exe改为.lnk
sprintf(szBuffer, "%s\\%s", lpszLnkFileDir, pstr);
int nLen = strlen(szBuffer);
szBuffer[nLen - 3] = 'l'; szBuffer[nLen - 2] = 'n';
szBuffer[nLen - 1] = 'k';
}
//保存快捷方式到指定目录下
WCHAR wsz[MAX_PATH]; //定义Unicode字符串
MultiByteToWideChar(CP_ACP, 0, szBuffer, -1, wsz, MAX_PATH);
hr = ppf->Save(wsz, TRUE);
ppf->Release();
pLink->Release();
return SUCCEEDED(hr);
}
int main()
{
char szPath[MAX_PATH];
CoInitialize(NULL);
GetDesktopPath(szPath);
if (CreateFileShortcut(NULL, szPath, NULL, NULL, MAKEWORD(VK_F12, HOTKEYF_CONTROL), "That is a test"))
printf("创建成功\n");
char ss[255] = {0};
gets(ss);
CoUninitialize();
return 0;
}