Часто задаваемые вопросы и ответы по C/C++/Visual C++
Последнее обновление: 27.08.2003
FAQ по C/C++/Visual C++
Работа с сетью
Как создать ярлык
Вариант trainer
Составители: SUnteXx, Leprecon
Как создать ярлык
A: (trainer)
Оригинальная ссылка: нету

Функция, позволяющая создать ярлык к файлу в требуемом месте.
Использует 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();
}

Содержание Обсудить на форуме « Предыдущая статья | Следующая статья »
Перейти к FAQ:  
FAQ составлен по материалам Форума на Исходниках.Ру.
Copyright © 2002 by Sources.ru. All rights reserved.