Как создать ярлык
Способ 1.
#include <shlobj.h>Добавочные функции:
/*
Shell link creator, by Alfa
mailto: Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в вашем браузере должен быть включен Javascript.
*/
CoInitialize(NULL);
IShellLink *SLink;
HRESULT HRes = CoCreateInstance(CLSID_ShellLink, 0, CLSCTX_INPROC_SERVER,
IID_IShellLink, ( LPVOID*)&SLink);
HRes = SLink->SetPath("C:\\app.exe");// Путь к запускаемой программе, для которой создаем ярлык
HRes = SLink->SetWorkingDirectory("C:\\");// Рабочий каталог для програмы
IPersistFile *PF;
HRes = SLink->QueryInterface(IID_IPersistFile, (LPVOID*)&PF);
WORD path[MAX_PATH];
TCHAR buf1[MAX_PATH];
LPITEMIDLIST pl;
SHGetSpecialFolderLocation(NULL, CSIDL_DESKTOP, &pl);
SHGetPathFromIDList(pl, buf1);
lstrcat(buf1, "\\");
lstrcat(buf1, "link_for_app_1.lnk");
MultiByteToWideChar(CP_ACP, 0, buf1, -1, path, MAX_PATH);
HRes = PF->Save(path, TRUE);// Сохранить
SLink->Release();
CoUninitialize();
SLink->SetArguments(LPCSTR argum);// Командная строка для програмы
SLink->SetIconLocation(LPSTR IconPath, strlen(IconPath), int IconIndex);//Иконка у ярлыка
Способ 2.
Функция, позволяющая создать ярлык к файлу в требуемом месте.
Использует Component Object Model
#include <objidl.h>До использования данной фунции необходимо, чтобы программа сообщила Windows о желании использовать COM-объекты, вызвав функцию CoInitialize(NULL).
#include <shlobj.h>
...
//---------------------------------------------------------------------
#define HOTKEY(modifier,key) ((((modifier)&0xff)<<8)|((key)&0xff))
//---------------------------------------------------------------------
// Создание ярлыка
// Входные параметры:
// pwzShortCutFileName - путь и имя ярлыка, например, "C:\\Блокнот.lnk"
// Если не указан путь, ярлык будет создан в папке, указанной в следующем параметре.
// Прим.: Windows сама НЕ добавляет к имени расширение .lnk
// pszPathAndFileName - путь и имя программы/файла, например, "C:\\Windows\\NotePad.Exe"
// или "C:\\Мои документы\\Файл.doc"
// pszWorkingDirectory - рабочий каталог, например, "C:\\Windows"
// pszArguments - аргументы командной строки, например, "C:\\Doc\\Text.Txt"
// wHotKey - горячая клавиша, например,
// для Ctrl+Alt+A HOTKEY(HOTKEYF_ALT|HOTKEYF_CONTROL,'A')
// iCmdShow - начальный вид, например, SW_SHOWNORMAL.
// Полный список - см. параметр nCmdShow функции ShowWindow
// pszIconFileName - путь и имя файла, содержащего иконку, например, "C:\\Windows\\NotePad.Exe"
// int iIconIndex - индекс иконки в файле, нумеруется с 0
// Возвращаемое значение:
// успешность создания ярлыка ( true - ярлык создан; false - ошибка )
bool CreateShortcut(LPCWSTR pwzShortCutFileName,
LPCTSTR pszPathAndFileName,
LPCTSTR pszWorkingDirectory,
LPCTSTR pszArguments,
WORD wHotKey,
int iCmdShow,
LPCTSTR pszIconFileName,
int iIconIndex) {
IShellLink * pSL; /* будущий ярлык */
IPersistFile * pPF; /* файл, в котором параметры ярлыка будут храниться */
HRESULT hRes;
// Создание экземпляра компонента "Ярлык"
hRes = CoCreateInstance(CLSID_ShellLink,0,CLSCTX_INPROC_SERVER,IID_IShellLink,(LPVOID*)&pSL);
if( SUCCEEDED(hRes) ) {
hRes = pSL->SetPath(pszPathAndFileName);
if( SUCCEEDED(hRes) ) {
hRes = pSL->SetArguments(pszArguments);
if( SUCCEEDED(hRes) ) {
hRes = pSL->SetWorkingDirectory(pszWorkingDirectory);
if( SUCCEEDED(hRes) ) {
hRes = pSL->SetIconLocation(pszIconFileName,iIconIndex);
if( SUCCEEDED(hRes) ) {
hRes = pSL->SetHotkey(wHotKey);
if( SUCCEEDED(hRes) ) {
hRes = pSL->SetShowCmd(iCmdShow);
if( SUCCEEDED(hRes) ) {
// Получение компонента хранилища параметров
hRes = pSL->QueryInterface(IID_IPersistFile,(LPVOID*)&pPF);
if( SUCCEEDED(hRes) ) {
// Сохранение созданного ярлыка
hRes = pPF->Save(pwzShortCutFileName,TRUE);
pPF->Release();
}
}
}
}
}
}
}
pSL->Release();
}
return SUCCEEDED(hRes);
}
Пример использования совместно с VCL ( Borland C++ Builder ) - упрощено.
На форме расположены
TEdit *NameEdit - имя ярлыка
TEdit *PathEdit - путь и имя программы
TEdit *ParamEdit - параметры командной строки
TEdit *FolderEdit - рабочая папка
TEdit *IconContainerEdit - файл, содержащий иконку
TEdit *IconNumberEdit - индекс иконки в файле
TBitBtn *ApplyBitBtn - кнопка "Создать ярлык"
Горячая кнопка - Ctrl+Alt+A
Начальное состояние окна - нормальное
void __fastcall TMyForm::ApplyBitBtnClick(TObject *Sender) {
WCHAR buffer[256];
int iIcon=StrToIntDef(IconNumberEdit->Text,0);
CoInitialize(NULL);
if( CreateShortcut(NameEdit->Text.WideChar(buffer,255),
PathEdit->Text.c_str(),
FolderEdit->Text.c_str(),
ParamEdit->Text.c_str(),
HOTKEY(HOTKEYF_ALT|HOTKEYF_CONTROL,'A'),
SW_SHOWNORMAL,
IconContainerEdit->Text.c_str(),
iIcon) == false ) {
MessageBeep(MB_ICONEXCLAMATION);
MessageBox(NULL,_T("Не удалось создать ярлык"),_T("Ошибка"),MB_OK|MB_ICONSTOP);
}
CoUninitialize();
}
Пример использования совместно с MFC ( Microsoft Visual C++ ) - упрощено.
На форме расположены
EDITTEXT IDC_NAMEEDIT - имя ярлыка
EDITTEXT IDC_PATHEDIT - путь и имя программы
EDITTEXT IDC_PARAMEDIT - параметры командной строки
EDITTEXT IDC_FOLDEREDIT - рабочая папка
EDITTEXT IDC_ICONCONTAINEREDIT - файл, содержащий иконку
EDITTEXT IDC_ICONNUMBEREDIT( со стилем ES_NUMBER ) - индекс иконки в файле
CButton *ApplyBtn - кнопка "Создать ярлык"
Горячая кнопка - Ctrl+Alt+A
Начальное состояние окна - нормальное
void CMyDialog::DoDataExchange(CDataExchange* pDX) {
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CDialog)
// CString m_szName
DDX_Text(pDX, IDC_NAMEEDIT, m_szName);
// CString m_szPath
DDX_Text(pDX, IDC_PATHEDIT, m_szPath);
// CString m_szParam
DDX_Text(pDX, IDC_PARAMEDIT, m_szParam);
// CString m_szFolder
DDX_Text(pDX, IDC_FOLDEREDIT, m_szFolder);
// CString m_szIconContainer
DDX_Text(pDX, IDC_ICONCONTAINEREDIT, m_szIconContainer);
// int m_iIconNumber
DDX_Text(pDX, IDC_ICONNUMBEREDIT, m_iIconNumber);
DDV_MinMaxInt(pDX, m_iIconNumber, 0, 99);
//}}AFX_DATA_MAP
}
void CMyDialog::OnApplyBtnClick() {
CoInitialize(NULL);
if( CreateShortcut(T2W((LPCTSTR)m_szName),
(LPCTSTR)m_szPath,
(LPCTSTR)m_szFolder,
(LPCTSTR)m_szParam,
HOTKEY(HOTKEYF_ALT|HOTKEYF_CONTROL,'A'),
SW_SHOWNORMAL,
(LPCTSTR)m_szIconContainer,
m_iIconNumber) == false ) {
MessageBeep(MB_ICONEXCLAMATION);
MessageBox(NULL,_T("Не удалось создать ярлык"),_T("Ошибка"),MB_OK|MB_ICONSTOP);
}
CoUninitialize();
}