Способ 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(); }
|