Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
2-1187373659
FireSonic
2007-08-17 22:00
2007.09.09
Каким образом возможно это сделать?


15-1185869028
Alex Konshin
2007-07-31 12:03
2007.09.09
Анализатор трейс файлов Оракл.


15-1187077601
White Barsik
2007-08-14 11:46
2007.09.09
Немного глупых вопросов


15-1187008383
Empleado
2007-08-13 16:33
2007.09.09
Предлагаю акцию


2-1187073587
kolj
2007-08-14 10:39
2007.09.09
Как убрать програму с панели пуск ?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский