Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: [FAQ] создание ярлыка  (Прочитано 12243 раз)
0 Пользователей и 2 Гостей смотрят эту тему.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« : 23-10-2004 16:29 » 

1) как программно сгенерить ярлык к файлу и заполнить его свойства

2) как засунуть файл в меню "Пуск" (можно конечно просто скопировать в папку
C:\WINDOWS\Главное меню\Программы\ , но где гарантия, что путь будет написан по-русски?)
« Последнее редактирование: 19-09-2010 13:50 от Алексей1153++ » Записан

Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #1 : 23-10-2004 17:46 » 

1. Вот здесь некто aTeos выложил такой текст
Цитата
Процедура создания ярлыка

Код:
  
procedure CreateLink(LNKPath,      // LNK file location
                     CommandLine,  // command line to execute
                     Args,         // command line arguments
                     WorkDir,      // working directory
                     IconLocation, // icon filename for shortcut
                     ShortCutName  // shortcut name (LNK filename)
                     : String);
var
  IObj: IUnknown;
  Link: IShellLink;
  IPFile: IPersistFile;
  TargetW: WideString;

begin
  CoInitialize(nil);
  IObj := CreateComObject(CLSID_ShellLink);
  if IObj = nil then Exit;
  Link := IObj as IShellLink;
  IPFile := IObj as IPersistFile;
  with Link do
  begin
    SetPath(PChar(CommandLine));
    SetArguments(PChar(Args));
    SetShowCmd(SW_SHOWNORMAL);
    SetWorkingDirectory(PChar(WorkDir));
    SetIconLocation(PChar(IconLocation),0);
    SetDescription(PChar(ShortCutName));
  end;
  TargetW := LNKPath+'\'+ShortCutName+'.lnk';
  IPFile.Save(PWChar(TargetW), False);
  CoUnInitialize;
end;


Как вызвать, думаю, разберешься. Если что, спрашивай
В Uses должно быть подключено ActiveX, ComObj, ShlObj  



2. загляни в регистре HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders ключ Programs
« Последнее редактирование: 02-12-2007 15:38 от Алексей1153++ » Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Pu
Большой босс

ru
Offline Offline
78


« Ответ #2 : 27-10-2004 06:56 » 

Алексей1153, вот тебе немного кода , который ставит икону на рабочий стол, код работает проверено Улыбаюсь.

Код:
#include "stdafx.h"
#include "objbase.h"
#define _WIN32_IE 0x0400
#include <shlobj.h>
 
   void CreateLinkThenChangeIcon(LPTSTR fname_to_create_link, LPTSTR lnk_fname)
{
   CoInitialize(0);
   HRESULT hres;
   IShellLink *psl = NULL;
   IPersistFile *pPf = NULL;
   WORD wsz[256];
   TCHAR buf[256];
   int id;
   LPITEMIDLIST pidl;

   hres = CoCreateInstance(  CLSID_ShellLink,
                           NULL,
                           CLSCTX_INPROC_SERVER,
                           IID_IShellLink,
                           (LPVOID*)&psl);
   if(FAILED(hres))
      goto cleanup;
   hres = psl->QueryInterface(IID_IPersistFile, (LPVOID*)&pPf);
   if(FAILED(hres))
      goto cleanup;
   hres = psl->SetPath(fname_to_create_link);
   if(FAILED(hres))
      goto cleanup;
   //place the shortcut on the desktop
   SHGetSpecialFolderLocation( NULL, CSIDL_DESKTOP, &pidl);
   SHGetPathFromIDList(pidl, buf);
   lstrcat(buf,"\\");
   lstrcat(buf,lnk_fname);
   MultiByteToWideChar(CP_ACP, 0, buf, -1, wsz, MAX_PATH);
   hres = pPf->Save(wsz, TRUE);
   if(FAILED(hres))
      goto cleanup;
   GetSystemDirectory(buf, 256);
   lstrcat(buf,"\\shell32.dll");
   hres = psl->SetIconLocation(buf, 1);
   if(FAILED(hres))
      goto cleanup;
   hres = psl->GetIconLocation(buf, 256, &id);
   if(FAILED(hres))
      goto cleanup;
   pPf->Save(wsz, TRUE);

cleanup:
   if(pPf)
      pPf->Release();
   if(psl)
      psl->Release();
}
int _tmain(int argc, _TCHAR* argv[])
{
   CreateLinkThenChangeIcon( "E:\\1.txt", "link1.lnk");
}
« Последнее редактирование: 02-12-2007 15:42 от Алексей1153++ » Записан

Насколько я опытен? Достаточно, чтобы понимать, что дураков нельзя заставить думать по–другому, но недостаточно, чтобы отказаться от попыток это сделать.
(с) Артур Джонс
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #3 : 18-09-2010 17:17 » new

я переделал функцию Pu таким образом (работает, тестировал)
Вопрос по закомментированной части в конце кода - ярлык работает и без этого куска. Я так и не понял, что сей кусок делает ?

Код:
#include <objbase.h>
#define _WIN32_IE 0x0700
#include <shlobj.h>
#include <vector>


//location задаёт путь , где ярлык будет лежать.
//если location==0, для нахождения пути будет использован
//параметр or_location в вызове SHGetSpecialFolderLocation
void CreateLinkThenChangeIcon(
const char* filepath,
const char* linkname,
const char* location=0,
WORD or_location=CSIDL_DESKTOP,
const char* shell32_dll="shell32.dll")
{
CoInitialize(0);
HRESULT hres=0;
IShellLink* psl=0;
IPersistFile* pPf=0;

std::vector<wchar_t> wsz;//(MAX_PATH ,0);
std::vector<char> buf;//(MAX_PATH ,0);

int id=0;
LPITEMIDLIST pidl=0;

hres=CoCreateInstance(CLSID_ShellLink,0,CLSCTX_INPROC_SERVER,IID_IShellLink,(LPVOID*)&psl);

for(;;)
{
if(FAILED(hres))break;

hres = psl->QueryInterface(IID_IPersistFile, (LPVOID*)&pPf);
if(FAILED(hres))break;

hres = psl->SetPath(filepath);
if(FAILED(hres))break;


if(location)
{
buf.insert(buf.end(),location,location+strlen(location));//без 0
}
else
{
SHGetSpecialFolderLocation(0, or_location, &pidl);
buf.resize(MAX_PATH,0);
SHGetPathFromIDList(pidl, &buf[0]);
buf[buf.size()-1]=0;
buf.resize(strlen(&buf[0]));//без 0
}
buf.push_back('\\');
buf.insert(buf.end(),linkname,linkname+strlen(linkname)+1);//с 0

if(!buf.size())break;

wsz.resize(MAX_PATH,0);
MultiByteToWideChar(CP_ACP, 0, &buf[0], -1, &wsz[0], min(buf.size(),wsz.size()));
wsz[wsz.size()-1]=0;
hres = pPf->Save(&wsz[0], 1);
if(FAILED(hres))break;

/*
GetSystemDirectory(&buf[0], buf.size());
buf[buf.size()-1]=0;
buf.resize(strlen(&buf[0]));//без 0
buf.push_back('\\');
if(shell32_dll)
{
buf.insert(buf.end(),shell32_dll,shell32_dll+strlen(shell32_dll)+1);//с 0
}

hres = psl->SetIconLocation(&buf[0], 1);
if(FAILED(hres))break;

hres = psl->GetIconLocation(&buf[0], buf.size(), &id);
if(FAILED(hres))break;
buf[buf.size()-1]=0;
buf.resize(strlen(&buf[0]));//без 0

pPf->Save(&wsz[0], 1);
*/


break;
}

if(pPf)pPf->Release();
if(psl)psl->Release();
}

« Последнее редактирование: 18-09-2010 17:37 от Алексей1153++ » Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #4 : 18-09-2010 18:44 » 

в Qt делается чуток попроще Отлично
Код:
	QFile(_filepath).link(QDir::cleanPath(_location)+"/"+_linkname);
Записан

Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines