Eolite
-
Можно ли как-то поменять иконки исполняемых файлов на свои, без перекомпиляции приложения? Сейчас из-за них происходит путаница с другими файлами без расширения.
Eolite 3.75
Читает первые 4 байта у файлов без расширения, и если это "KPAC" или "MENU", то показывает иконку программы.
Читает первые 4 байта у файлов без расширения, и если это "KPAC" или "MENU", то показывает иконку программы.
- Attachments
-
-
appicons.png (40.8 KiB)Viewed 4901 times
-
Из хаоса в космос
Code: Select all
IF(DSDWORD[#BYTE_HEAD_FILE]=='KCPK')||(DSDWORD[#BYTE_HEAD_FILE]=='UNEM') icon_n = 6;
Решение не идеальное, но оно в целом хорошее.0CodErr wrote:Очень плохая идея. Упаковано kpack-ом может быть всё что угодно.Code: Select all
IF(DSDWORD[#BYTE_HEAD_FILE]=='KCPK')||(DSDWORD[#BYTE_HEAD_FILE]=='UNEM') icon_n = 6;
Вероятность того, что файл упакован kpack-ом и не имеет расширения - мала.
Из хаоса в космос
Значит ли это, что у приложений колибри нет собственного идентификатора?
Или я чего-то не правильно понимаю?
Или я чего-то не правильно понимаю?
Ну вообще, да. Но можно при желании поправить kpack и добавить в header упакованного файла флаг, означающий, что упаковано приложение. Для этого вполне хватит одного бита. Другой вариант, это всё-таки начать использовать расширения kex. Хотя это вызовет увеличение длины имени файла. В принципе, думаю, можно даже оба варианта реализовать.Вероятность того, что файл упакован kpack-ом и не имеет расширения - мала.
'MENUET01', если ты об этом.Mega_Myr wrote:Значит ли это, что у приложений колибри нет собственного идентификатора?
Или я чего-то не правильно понимаю?
Похоже я совсем не понимаю что происходит. Пожалуй на время воздержусь от вопросов.
У программ Колибри есть соственный идентификатор MENUET01 http://prntscr.com/dboos7Mega_Myr wrote:Похоже я совсем не понимаю что происходит. Пожалуй на время воздержусь от вопросов.
Однако все программый в дисте сжаты KPACK'ом, потому имеют KPACK http://prntscr.com/dbopbk
Как мне определить что сжатый файл это программа? Ну... его можно разжать, вот только это долго и нетсмысла так нагружать проц, чтобы просто отобразить иконку.
Как вариант, предположить, что сжатый файл без расширения - это программа. Так и будет в 99,9% случаев, что приемлимо.
0CodErr предложил варианты решения ситуации. Например, добавлять расширение .kex все программам.
Из хаоса в космос
Чтение файла в любом случае долго. А что, если это будет не локальная папка? Получается, что лучше всё-таки использовать расширения. В принципе, никто и не мешает добавить их к программам.Leency wrote:Как мне определить что сжатый файл это программа? Ну... его можно разжать, вот только это долго и нетсмысла так нагружать проц, чтобы просто отобразить иконку.
У меня стояло в начале ограничение на эту фичу только /rd/1 и /tmp
Но я решил включить для всех.
Расширения вариант.
Но я решил включить для всех.
Расширения вариант.
Из хаоса в космос
Может наоборот ?
Без расширения == программа.
Без расширения == программа.
что делать с файлами без расширений вроде licence и readme которые часто идут вместе с исходниками?
Из хаоса в космос
Шире мыслить надо, шире! Можешь даже ради эксперимента проверить, сколько у тебя самого таких "программ без расширения".Siemargl wrote:Без расширения == программа.
Вот, смотри, например
Spoiler:
Лайфхак, как это можно сделать сейчас
Думаю, суть кода понятна будет
Spoiler:
Code: Select all
Unit Unit1;
(* -------------------------------------------------------- *)
Interface
(* -------------------------------------------------------- *)
Uses KolibriOS;
(* -------------------------------------------------------- *)
Var
hConsole: Pointer;
ConsoleInit: Procedure(WndWidth, WndHeight, ScrWidth, ScrHeight: Dword; Caption: PChar); StdCall;
ConsoleExit: Procedure(bCloseWindow: Cardinal); StdCall;
printf: Function(Const Format: PChar): Integer; CDecl VarArgs;
(* -------------------------------------------------------- *)
Procedure Main;
(* -------------------------------------------------------- *)
Implementation
(* -------------------------------------------------------- *)
Procedure Main;
Const FileName = '/RD/1/........';
Var
FileAttributes: TFileAttributes;
LastAttributes: TFileAttributes;
Begin
hConsole := LoadLibrary('/sys/lib/console.obj');
ConsoleInit := GetProcAddress(hConsole, 'con_init');
ConsoleExit := GetProcAddress(hConsole, 'con_exit');
printf := GetProcAddress(hConsole, 'con_printf');
ConsoleInit($FFFFFFFF, $FFFFFFFF, $FFFFFFFF, $FFFFFFFF, 'Test');
If GetFileAttributes(FileName, LastAttributes) <> 0 {If File Is Not Exist} Then Begin
If CreateFile(FileName) <> 0 Then
printf('RDFreeSize can not be determined.'#10)
Else Begin
ResizeFile(FileName, $FFFFFFFF, 0);
GetFileAttributes(FileName, FileAttributes);
printf('RDFreeSize = %d'#10, FileAttributes.SizeLo);
DeleteFile(FileName);
End;
End Else {If File Is Already Exist} Begin
ResizeFile(FileName, $FFFFFFFF, 0);
GetFileAttributes(FileName, FileAttributes);
printf('RDFreeSize = %d'#10, FileAttributes.SizeLo);
ResizeFile(FileName, LastAttributes.SizeLo, 0);
End;
ConsoleExit(0);
ThreadTerminate;
End;
(* -------------------------------------------------------- *)
End.
Spoiler:
Переименовать к единому стандарту.Leency wrote:что делать с файлами без расширений вроде licence и readme которые часто идут вместе с исходниками?
Т.е сначала утвердить некий список стандартных расширений.
Вроде всегда licence.txt и readme.txt. У меня вообще нет ни одного файла без расширения.
Who is online
Users browsing this forum: No registered users and 2 guests