快捷方式自启动应用程序有两个路径
1.Windows下 Win+r 输入shell:startup 如下图所示
此路径是用户区的自启动路径,通常不同电脑路径不同,不建议使用
2.Windows下 Win+r 输入shell:common startup 如下图所示
此路径是Windows系统自带的,但需要***管理员权限***才能操作
OK,知道以上知识后,上代码
void CdemoDlg::OnCreateShotcut()
{
//创建快捷方式
CString strPathObj = appPath + "\\" + appName;
LPCSTR lpszPathObj = strPathObj;
CString cstrDesc = "link for " + appName;
LPCSTR lpszDesc = cstrDesc;
CString lpszPathLink("C:\\ProgramData\\Microsoft\\Windows\\Start Menu\\Programs\\Startup\\");
CString m_appName = appName.Left(appName.ReverseFind('.'));
lpszPathLink = lpszPathLink + m_appName + ".lnk";
CoInitialize(NULL);
HRESULT hres;
IShellLink* psl;
// Get a pointer to the IShellLink interface.
hres = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER,
IID_IShellLink, (LPVOID*)&psl);
if (SUCCEEDED(hres)){
IPersistFile* ppf;
//设置快捷方式的目标路径,添加描述
psl->SetPath(lpszPathObj);
psl->SetDescription(lpszDesc);
// Query IShellLink for the IPersistFile interface for saving the
// shortcut in persistent storage.
hres = psl->QueryInterface(IID_IPersistFile, (LPVOID*)&ppf);
if (SUCCEEDED(hres)){
WCHAR wsz[MAX_PATH];
// Ensure that the string is Unicode.
MultiByteToWideChar(CP_ACP, 0, lpszPathLink, -1, wsz, MAX_PATH);
// TODO: Check return value from MultiByteWideChar to ensure
// Save the link by calling IPersistFile::Save.
//下面代码执行可能会失败,因为权限不够,但是不用管,重新启
//动 Visual Studio 时使用管理员权限启动,或者启动编译生成
//的软件时,以管理员权限启动即可
hres = ppf->Save(wsz, TRUE);
ppf->Release();
}
psl->Release();
}
// return hres;
CoUninitialize();
}
PS:需要格外注意的是,自启动的软件里,如果有文件的读写操作,切忌使用相对路径,一定要使用绝对路径,自测觉得Windows给自启动的软件相对路径会默认为系统路径 C:\Windows\system32\