Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.09.09;
Скачать: CL | DM;

Вниз

Создание ярлыка   Найти похожие ветки 

 
$00FF00   (2007-03-11 16:25) [0]

Доброго времени суток, господа эксперты! Как программно (из-под 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.

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


 
Eraser ©   (2007-03-11 16:39) [1]

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


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

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

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

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


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


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


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


 
GrayFace ©   (2007-03-11 16:59) [3]

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


 
clickmaker ©   (2007-03-11 17:03) [4]

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


 
$00FF00   (2007-03-18 14:30) [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;


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

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


 
Eraser ©   (2007-03-18 15:41) [7]


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

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


 
_xXx_   (2007-03-19 19:26) [8]

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


 
VirEx ©   (2007-03-20 19:23) [9]


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

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



Страницы: 1 вся ветка

Текущий архив: 2007.09.09;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.018 c
15-1186590146
Mozart
2007-08-08 20:22
2007.09.09
Я в шоке от таких запросов!!!!


2-1187180620
r.o.o.t
2007-08-15 16:23
2007.09.09
Передача параметров..


15-1186646633
IlyaSofronov
2007-08-09 12:03
2007.09.09
Очень срочно дизайнер - от 3000 р.


4-1174241356
Sendick
2007-03-18 21:09
2007.09.09
USB-Flash


4-1174064441
ChainicDenis
2007-03-16 20:00
2007.09.09
Как узнать, установлен ли драйвер