FAQ по C/C++/Visual C++
Работа с сетью Как создать ярлык Вариант trainer |
Составители: SUnteXx, Leprecon |
Как создать ярлык | |||
Использует 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 составлен по материалам Форума на Исходниках.Ру. Copyright © 2002 by Sources.ru. All rights reserved. |