Оригинальный DVD-ROM: eXeL@B DVD !
eXeL@B ВИДЕОКУРС !

ВИДЕОКУРС ВЗЛОМ
выпущен 8 мая!


УЗНАТЬ БОЛЬШЕ >>
Домой | Статьи | RAR-cтатьи | FAQ | Форум | Скачать | Видеокурс
Новичку | Ссылки | Программирование | Интервью | Архив | Связь

ПРОГРАММИРОВАНИЕ НА C и С++



Возможности языков семейства Си по истине безграничны, однако, в этой свободе кроются и недостатки: всегда нужно программисту держать ухо востро и контроллировать "переполнение буфера", чтобы потом программа не вылетала в "синий экран" на массе разнообразных версий Windows и железа у пользователей. Те же крэкеры и реверсеры специально ищут в коде программ на Си уязвимости, куда можно подсадить любой вирусный код, об этом более подробно автор рассказывал в своём видеокурсе здесь. Я там многое узнал и теперь мой код стал значительно более безопасный.
Как создать ярлык
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();
 
 }



<< ВЕРНУТЬСЯ В ПОДРАЗДЕЛ

<< ВЕРНУТЬСЯ В ОГЛАВЛЕНИЕ




Материалы находятся на сайте https://exelab.ru/pro/



Оригинальный DVD-ROM: eXeL@B DVD !


Вы находитесь на EXELAB.rU
Проект ReactOS