Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Создание ярлыка [D6, Win95/98, WinXP]


$00FF00 ©   (2007-03-11 16:25:00) 

Доброго времени суток, господа эксперты! Как программно (из-под API-проги) создать в заданной папке ярлык, не используя ацццкие функции из ComObj и ActiveX? Можно ли это сделать простой записью в файл с расширением lnk? Пожалуйста, киньте примерчик! Или хотя бы объясните, как правильно записать в файл вот эту структуру (еле в SDK отыскал):

· The location (path) of the object referenced by the shortcut (called the "corresponding object").
· The working directory of the corresponding object.
· The list of arguments that the system passes to the corresponding object when the IContextMenu::InvokeCommand member function is activated for the shortcut.
· The show (SW_) command used to set the initial show state of the corresponding object.
· The location (path and index) of the shortcut's icon.
· The shortcut's description string.
· The hot key for the shortcut.

А то батник вместо ярлыка создавать несерьёзно :) Хотя в принципе можно создать на асме екзешник, запихнуть его в виде строки текста в исходный код и по запросу писать в виде проги в заданную папку... Впрочем нет. Слишком круто ;)


VirEx   (2007-03-20 19:23:00) [1]


> [5] $00FF00   (18.03.07 14:30)

помоему это ярлыки для win98, для XP формат другой


_xXx_   (2007-03-19 19:26:00) [2]

http://delphiworld.narod.ru/base/create_links_unit.html


Eraser   (2007-03-18 15:41:00) [3]


> $00FF00   (18.03.07 14:39) [6]

"можно еще скриптик специальный наваять и запускать его через wscript.exe" (c) [1]
+ CreateProcess, WaitForSingleObject.


$00FF00   (2007-03-18 14:39:00) [4]

Ах да забыл, lc() и uc() это соотв-но AnsiUpperCase и AnsiLowerCase, выковырянные из SysUtils. Кстати кто знает подскажите, как избавиться от приведённых мною глюков, а?


$00FF00   (2007-03-18 14:30:00) [5]

Чуваки, респект аграменный! Глянте какую вешшшш я тут набаянил!!! Наверняка поможет тем, кто не хочет перегружать прогу лишним кодом из activeX. Тут у нас чисто побайтная запись в файл. Правда без глюков как всегда не обошлось :(
1. Не пашет кнопка "Найти объект" (отсылает на рабочий стол);
2. В winXP до первого запуска ярлыка не отображается иконка, уступая место стандартному значку - "пустому окошку", а также глюкавят "свойства". Но после запуска с ярлыка всё встаёт на места! Видимо тут уже дыры латает сама система.

Но главное - ЭТО РАБОТАЕТ!!! Вуаля:

procedure MakeLink(path:string);
var
 f : TextFile;
 r : string;
 EXE_PATH : string;
 EXE_SIZE : string;

// ------------------------------------------------------- \\
function c(a:Byte):Char;
begin
result:=chr(a);
end;
// ------------------------------------------------------- \\
function GetExeLen:string;
var
 wfd : WIN32_FIND_DATA;
 lps : PChar;
 tmp : cardinal;
begin
 lps:=PChar(EXE_PATH);
 FindFirstFile(lps, wfd);
 tmp:=wfd.nFileSizeLow;

 Result:=
 chr(loByte(loWord(tmp)))+
 chr(hiByte(loWord(tmp)))+
 chr(loByte(hiWord(tmp)))+
 chr(hiByte(hiWord(tmp)));
end;
// ------------------------------------------------------- \\
function Get1stStructLen(plus20:boolean):string;
var tmp:Word;
begin
tmp:=length(EXE_PATH);
tmp:=tmp+tmp+18;
if plus20 then tmp:=tmp+20;
result:=
c(loByte(tmp))+
c(hiByte(tmp));
end;
// ------------------------------------------------------- \\
function Get2ndStructLen(ZeroOffset:boolean):string;
var tmp:Cardinal;
begin
tmp:=length(EXE_PATH);
tmp:=tmp+53;
if not ZeroOffset then tmp:=tmp+1;
result:=
c(hiByte(hiWord(tmp)))+
c(loByte(hiWord(tmp)))+
c(hiByte(loWord(tmp)))+
c(loByte(loWord(tmp)));
end;
// ------------------------------------------------------- \\
function GetPathAndLen:string;
var tmp:Word;
begin
tmp:=length(EXE_PATH);
result:=
c(loByte(tmp))+
c(hiByte(tmp))+
EXE_PATH;
end;
// ------------------------------------------------------- \\
begin
EXE_PATH:=paramStr(0);
EXE_SIZE:=GetExeLen;

r:=

c($4C) + c($00) + c($00) + c($00) + // The "L" letter

c($01) + c($14) + c($02) + c($00) + // |
c($00) + c($00) + c($00) + c($00) + // |  GUID of
c($C0) + c($00) + c($00) + c($00) + // | shortcuts
c($00) + c($00) + c($00) + c($46) + // |

c($43) + c($00) + c($00) + c($00) + // FLAGS !!!
c($00) + c($00) + c($00) + c($00) + // ATTRIBUTES !!!

// 3 random times (stolen from system LNK files) ;)
c($C0) + c($35) + c($D0) + c($87) + // | first
c($C1) + c($20) + c($BE) + c($01) + // | time

c($00) + c($08) + c($BF) + c($46) + // | second
c($BE) + c($DD) + c($C3) + c($01) + // | time

c($00) + c($29) + c($7E) + c($88) + // | third
c($BE) + c($DD) + c($C3) + c($01) + // | time

EXE_SIZE +                          // EXE LENGTH!!! (4-byte)

c($00) + c($00) + c($00) + c($00) + // Icon #0 is loaded
c($01) + c($00) + c($00) + c($00) + // SW_NORMAL = $01
c($00) + c($00) + c($00) + c($00) + // No hotkeys
c($00) + c($00) + c($00) + c($00) + // Reserved
c($00) + c($00) + c($00) + c($00) + // Reserved

// -------------- All above seems normal!!! -------------- \\
// 126
Get1stStructLen(true) +             // Size of item ID list

Get1stStructLen(false) +            // struct len
c($32) + c($00) +                   // Unknown
EXE_SIZE +                          // EXE LENGTH!!! (4-byte)
c($32) + c($30) + c($85) + c($63) + // Unknown
c($00) + c($00) +                   // file attrs???

lc(EXE_PATH) + c($00) +
uc(EXE_PATH) + c($00) +

// Some strange info was to be placed here.
// I do not know what it is needed for, but
// zero-flood also works normally :)
c($00) + c($00) + c($00) + c($00) +
c($00) + c($00) + c($00) + c($00) +
c($00) + c($00) + c($00) + c($00) +
c($00) + c($00) + c($00) + c($00) +

c($00) + c($00) +                   // Terminator chars

Get2ndStructLen(false) +
c($1C) + c($00) + c($00) + c($00) + // std. offset
c($01) + c($00) + c($00) + c($00) + // (flags) avail. on local drive
c($1C) + c($00) + c($00) + c($00) + // offset of local HDD table
c($34) + c($00) + c($00) + c($00) + // offset of path (from struct begin)
c($00) + c($00) + c($00) + c($00) + // [ignored] offset of network HDD
Get2ndStructLen(true) +
c($18) + c($00) + c($00) + c($00) + // len of struct
c($03) + c($00) + c($00) + c($00) + // HDD
c($00) + c($00) + c($00) + c($00) + // HDD's serial
c($10) + c($00) + c($00) + c($00) + // Offset (always $10)
'NO_NAME' + c($00) +                // [52 chars]
lc(EXE_PATH) + c($00) +
c($00) +                            // No final path!!!

GetPathAndLen +

c($00) + c($00) + c($00) + c($00);  // The end!!!

if path[length(path)]<>'\' then path:=path+'\';
path:=path+'ТИпа_ярлык.lnk';

{$I-}
AssignFile(f, path);
Rewrite(f);
Write(f, r);
CloseFile(f);
{$I+}
end;


clickmaker   (2007-03-11 17:03:00) [6]

http://www.wotsit.org/list.asp?search=LNK


GrayFace   (2007-03-11 16:59:00) [7]

Наверное можно повыдергивать то, что относится к созданию ярлыка.
А что за проект такой, что размер критичен?


$00FF00   (2007-03-11 16:42:00) [8]


> PS а почему бы не использовать интерфейс, предназначенный
> для этого?


Патамушта к екзешке +50 кб :( а для меня размер оччч. критичен. Потому и пишу на API.


Eraser   (2007-03-11 16:39:00) [9]

> [0] $00FF00   (11.03.07 16:25)


> Пожалуйста, киньте примерчик! Или хотя бы объясните, как
> правильно записать в файл вот эту структуру

Правильно - никак, т.к. это не документированно. Думаю там не очень сложная структура, HEX-редактор в помощь )

PS а почему бы не использовать интерфейс, предназначенный для этого?

PPS можно еще скриптик специальный наваять и запускать его через wscript.exe.


Наверх

Титульная страница Поиск, карта сайта Написать письмо