Форум: "WinAPI";
Текущий архив: 2007.09.09;
Скачать: [xml.tar.bz2];
ВнизСоздание ярлыка Найти похожие ветки
← →
$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 вся ветка
Форум: "WinAPI";
Текущий архив: 2007.09.09;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.044 c