Как создать ярлык

Способ 1.

 


#include <shlobj.h>
/*
Shell link creator, by Alfa
mailto: Этот e-mail защищен от спам-ботов. Для его просмотра в вашем браузере должна быть включена поддержка Java-script
*/


   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>
#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);
}
До использования данной фунции необходимо, чтобы программа сообщила Windows о желании использовать COM-объекты, вызвав функцию CoInitialize(NULL).


Пример использования совместно с 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();
}

 

 
« Предыдущая статья   Следующая статья »