2015-11-21 8 views

ответ

1

Вот решение. Он использует Qt, но это также возможно без. Затем просто используйте std::wstring вместо QString. Для конкатенации путей и имен файлов вам придется использовать строковые операции вместо использования QDir.

#include <shlobj.h> 

bool createStartMenuEntry(QString targetPath) { 
    targetPath = QDir::toNativeSeparators(targetPath); 

    WCHAR startMenuPath[MAX_PATH]; 
    HRESULT result = SHGetFolderPathW(NULL, CSIDL_COMMON_PROGRAMS, NULL, 0, startMenuPath); 

    if (SUCCEEDED(result)) { 
     QString linkPath = QDir(QString::fromWCharArray(startMenuPath)).absoluteFilePath("Shortcut Name.lnk"); 

     CoInitialize(NULL); 
     IShellLinkW* shellLink = NULL; 
     result = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_ALL, IID_IShellLinkW, (void**)&shellLink); 
     if (SUCCEEDED(result)) { 
      shellLink->SetPath(targetPath.toStdWString().c_str()); 
      shellLink->SetDescription(L"Shortcut Description"); 
      shellLink->SetIconLocation(targetPath.toStdWString().c_str(), 0); 
      IPersistFile* persistFile; 
      result = shellLink->QueryInterface(IID_IPersistFile, (void**)&persistFile); 

      if (SUCCEEDED(result)) { 
       result = persistFile->Save(linkPath.toStdWString().c_str(), TRUE); 

       persistFile->Release(); 
      } else { 
       return false; 
      } 
      shellLink->Release(); 
     } else { 
      return false; 
     } 
    } else { 
     return false; 
    } 
    return true; 
} 

То та часть, которая получает местоположение папки запуска меню:

WCHAR startMenuPath[MAX_PATH]; 
HRESULT result = SHGetFolderPathW(NULL, CSIDL_COMMON_PROGRAMS, NULL, 0, startMenuPath); 

Остальное является то создание ярлыка. Название и описание ярлыка Exchange для ваших желаемых значений.