что такое значок индекса? - PullRequest
       1

что такое значок индекса?

0 голосов
/ 19 октября 2018

Я пытаюсь программно создать ссылку на оболочку, т.е. ярлык.В Visual Studio C ++.

Ярлык создан, и он работает.Но значок является значком по умолчанию (поскольку предоставленный значок не был принят во внимание API).Читая документы, кажется, что я должен предоставить значок index .Но что это?На данный момент существует только файл .ico.

Вот код (см. ### строки)

#include "stdafx.h"
#include <iostream>
#include <string>
#include <ShlObj.h>

class MakeLnk
{

   public:
      MakeLnk(){}
      void SetLnkInfos
     (
     std::wstring i_target,
     std::wstring i_args,
     std::wstring i_savePath,
     std::wstring i_description,
     std::wstring i_icoloc
     )
  {
     target = i_target;
     args = i_args; 
     savePath = i_savePath;
     description = i_description;
     icolocation = i_icoloc;
  }

  // Utility function, to create a link
  HRESULT CreateLnk()
  {
     LPCWSTR lpszPathObj = target.c_str();
     LPCTSTR arguments = args.c_str();
     LPCWSTR lpszLinkPath = savePath.c_str();
     LPCWSTR lpszDesc = description.c_str();
// ##########################
     LPCWSTR lpszIcoPath = icolocation.c_str(); // a path like "C:\\tmp\\crab.ico"
// ##########################

     HRESULT hres;
     IShellLink* psl;
     CoInitialize(NULL);
     // Get a pointer to the IShellLink interface. It is assumed that CoInitialize
     // has already been called.
     hres = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (LPVOID*)&psl);
     if (SUCCEEDED(hres))
     {
        IPersistFile* ppf;

        // Set the path to the shortcut target and add description and args. 
        psl->SetPath(lpszPathObj);
        psl->SetDescription(lpszDesc);
        psl->SetArguments(arguments);
// ###############################################
        psl->SetIconLocation(lpszIcoPath, 0); // HERE! WHAT TO PUT INSTEAD OF "0" ?
// ###############################################
        // Query IShellLink for the IPersistFile interface, used for saving the 
        // shortcut in persistent storage. 
        hres = psl->QueryInterface(IID_IPersistFile, (LPVOID*)&ppf);

        if (SUCCEEDED(hres))
        {
           // Save the link by calling IPersistFile::Save. 
           hres = ppf->Save(lpszLinkPath, TRUE);
           ppf->Release();
        }
        psl->Release();
     }
     CoUninitialize();
     return hres;
  }

private:
  std::wstring target, args, savePath, description;
  std::wstring icolocation;
};


int main()
{
    MakeLnk linkMaker;
    std::wstring exepath(L"C:\\Program Files\\Crab\\Exec.exe"), arguments(L"eat dance"), lnkPath(L"shortcut.lnk"), description(L"Click here to lanch the crab program"), icon(L"C:\\tmp\\crab.ico");
    linkMaker.SetLnkInfos(exepath, arguments, lnkPath, description, icon);
    bool res = linkMaker.CreateLnk();
    return res ? 0 : -1;
}

Ответы [ 2 ]

0 голосов
/ 19 октября 2018

Исполняемые файлы Windows могут иметь так называемые ресурсы .Одним из типов ресурсов является значок.Следовательно, исполняемый файл может содержать 0, 1 или более значков.Если вам нужен второй значок в вашем исполняемом файле, используйте значок индекса 1 (как обычно, они нумеруются от 0)

Если у вас есть файл .ico, его необходимо добавить всначала ваш исполняемый файл, прежде чем вы сможете его использовать.SetIconLocation работает только на исполняемые файлы (и DLL)

0 голосов
/ 19 октября 2018

Ссылки оболочки могут получать свои значки из файлов EXE и DLL, где они хранятся как встроенные ресурсы.Поскольку файл EXE или DLL может содержать несколько значков, ссылка на оболочку должна знать, какой из них использовать.Это контролируется индексом.

Файлы ICO (если я правильно помню) могут содержать только один значок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...