IPB

Добро пожаловать, гость ( Вход | Регистрация )

8 Страниц V « < 6 7 8  
Reply to this topicStart new topic
> Delphi, Asm, C, WinAPI, PHP, ..., FAQ
-=CHE@TER=-
Oct 27 2016, 15:59
Сообщение #141


Walter Sullivan
***

Группа: Root Admin
Сообщений: 1,130
Регистрация: 4-February 08
Пользователь №: 3
Спасибо сказали: 269 раз(а)



Отличный пример наглядно иллюстрирующий почему если ты не чистишь память сразу после выделения (или не выделяешь с флагом автоматической очистки типа HEAP_ZERO_MEMORY / LMEM_ZEROINIT / GMEM_ZEROINIT и т.п.), то ты - баобаб.
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
-=CHE@TER=-
Nov 23 2016, 15:03
Сообщение #142


Walter Sullivan
***

Группа: Root Admin
Сообщений: 1,130
Регистрация: 4-February 08
Пользователь №: 3
Спасибо сказали: 269 раз(а)



QUOTE(-=CHE@TER=- @ Feb 13 2014, 14:49) *
Натолкнулся на то, что в нескольких играх используется LZSS, описанный в моём сообщении выше.
Но, есть одно отличие MS-LZSS (Microsoft LZSS) от классического LZSS (который, похоже, используется во многих играх), без которого на выходе получится не файл, а что попало.
Нашёл ещё одну вариацию - применялась в старых играх от Blizzard:
- Warcraft: Orcs and Humans
- Blackthorne
- Lost Vikings
В ближайшее время распаковщик на сайт добавлю (там нет имён и через флаги у размера / смещения файла определяется сжат он или нет). Кому интересно, описываю изменения в том алгоритме что я приводил ранее.

Вот эти строки:
CODE
FillChar(buff[0], $FFF + 1, 32);
I:=($FFF + 1) - 16;
...
J:=J + ((Len And $F0) ShL 4);
Len:=(Len And $0F) + 3;

Заменяются этими:
CODE
FillChar(buff[0], $FFF + 1, 0);
I:=0;
...
J:=J + ((Len And $0F) ShL 8);
Len:=((Len And $F0) ShR 4) + 3;

И всё.


Спасибо сказали:
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
-=CHE@TER=-
Jan 29 2017, 19:55
Сообщение #143


Walter Sullivan
***

Группа: Root Admin
Сообщений: 1,130
Регистрация: 4-February 08
Пользователь №: 3
Спасибо сказали: 269 раз(а)



AsmBB
Форум написанный на FASM. Нет, вы не ослышались. Да, это Assembler.
Дизайн дикий, функционал скромный, но идея интересная - наверняка потом в какой-нибудь KolibriOS интегрируют. (*улыбается*)
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
Siberian GRemlin
Feb 27 2017, 09:33
Сообщение #144


Advanced Member
***

Группа: CTPAX-X
Сообщений: 452
Регистрация: 4-February 08
Пользователь №: 2
Спасибо сказали: 185 раз(а)



Установил игру на 64-разрядную систему. Программа устанавливается через 32-разрядную InstallShield 11.0, но каким-то образом пишет данные в область реестра доступную только 64-разрядным приложениям. Например, создаёт ветку, которая в 64-разрядном редакторе реестра доступна, а в 32-разрядном отсутствует.
CODE
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-21-3391727471-1739702130-609907194-1000\Components\66EEC61806F24F94D949A665B121C141


Таким образом, я из своего 32-разрядного приложения не могу получить путь к установленной игре, так как это единственное место в системе, где он указывается. Игра, кстати, 2006 года и 32-разрядная.

Кто-нибудь сталкивался с такой проблемой? Предполагаю, что решение существует, но не могу корректно сформулировать поисковый запрос.

Добавлено.
Нашёл кривое решение через экспорт ветки в файл, который нужно затем читать.
CODE
REG.EXE export HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-21-3391727471-1739702130-609907194-1000\Components\66EEC61806F24F94D949A665B121C141 test.reg


Добавлено позже.
Похоже, из 32-разрядного приложения вызывается только 32-разрядная версия REG.EXE со всеми вытекающими. Идиотство.
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
-=CHE@TER=-
Feb 28 2017, 08:16
Сообщение #145


Walter Sullivan
***

Группа: Root Admin
Сообщений: 1,130
Регистрация: 4-February 08
Пользователь №: 3
Спасибо сказали: 269 раз(а)



Переместил твоё сообщение в более подходящую тему.
Как я понял, тебе поможет KEY_WOW64_64KEY при вызове RegOpenKeyEx().
Обрати внимание, что эта штука не будет работать под Windows 2000.
Ещё снизу см. Note - есть другой способ без флагов, но "it's stable but it should be considered an implementation detail subject to change".
Такие дела.
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
-=CHE@TER=-
Jul 2 2017, 14:16
Сообщение #146


Walter Sullivan
***

Группа: Root Admin
Сообщений: 1,130
Регистрация: 4-February 08
Пользователь №: 3
Спасибо сказали: 269 раз(а)



Может кому пригодится: libunpak.zip (~16 Kb)
Библиотека для Delphi 7, где я собрал бинарники для последних:
- puff() из zlib (распаковывает deflate)
- blast() из zlib (распаковывает PKWARE)
Теперь это библиотека, с небольшой обёрткой, которая позволяет работать обоим алгоритмам с памятью, а не жёстким диском. Плюс к blast() добавил интерфейс, так что он теперь тоже может возвращать необходимый размер буфера для распаковки. Давно хотел такую штуку для Delphi, без всяких зависимостей от "msvcrt.dll" и прочего мусора.
Также в архиве программа-пример и два файла "deflate.dat" и "pkware.dat" на которых можно потренироваться.
Через дефайны: NO_DEFLATE или NO_PKWARE можно убрать ненужные алгоритмы, для уменьшения размера.
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
-=CHE@TER=-
Dec 11 2017, 12:54
Сообщение #147


Walter Sullivan
***

Группа: Root Admin
Сообщений: 1,130
Регистрация: 4-February 08
Пользователь №: 3
Спасибо сказали: 269 раз(а)



Прошло 10 лет с момента. Посмотрел я снова Lazarus, последнюю версию - 1.8.0 (5-го декабря, кстати, вышла). Для теста взял один не очень большой и сложный проект на Delphi 7. Сконвертировался он нормально, но поглядев как работает я всё равно продолжаю офигевать от этого ужаса:
- .EXE файлы по прежнему толстые: проект в Delphi 7 был 500 Кб, здесь - 2 Мб, и это с включённой в опциях проекта оптимизацией по размеру и отключённой отладочной информацией (без них будут десятки мегабайт);
- не смотря на то что проект сконвертировался без проблем, в FPC / Lazarus у TJPEGImage нет метода DIBNeeded, на что мне сразу вышибло ошибку - прозреваю, что это не единственная несовместимость;
- контрол TImage так за 10 лет и не починили (долбанный стыд!) - достаточно провести по нему мышкой, чтобы он начал ужасно, чудовищно и вырвиглазно моргать и перерисовываться (хотя в изображение никаких изменений не вносилось);
- все строки в UTF-8 (почему-то ключ в настройках проекта об использовании ANSIString игнорируется), поэтому загружая файлы с русскими строчками в 1251 вы будете видеть "????" вместо них;
- если у вас на компьютере стоял FPC старой версии, то сносите его перед установкой Lazarus, ибо эта скотина вместо установленного с ней 3.0.4, будет подтягивать старый, который уже стоит в системе, в результате вы ничего не сможете скомпилировать (половины юнитов не будет);
- установщик никакой - ставит всё, в том числе компоненты, которые вы никогда не использовали, не используете и использовать не будете, причём вместе с исходными кодами, так что готовьте гигабайт свободного места под всё это барахло (а ещё это всё будет долго устанавливаться), ибо выбрать только то что вам нужно во время установки вы не сможете.
Там ещё всякого по мелочи и хотя есть и положительные моменты, но, в целом, всё по прежнему очень грустно.
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
-=CHE@TER=-
Dec 25 2017, 17:16
Сообщение #148


Walter Sullivan
***

Группа: Root Admin
Сообщений: 1,130
Регистрация: 4-February 08
Пользователь №: 3
Спасибо сказали: 269 раз(а)



QUOTE(-=CHE@TER=- @ Feb 13 2014, 14:49) *
Натолкнулся на то, что в нескольких играх используется LZSS, описанный в моём сообщении выше.
Но, есть одно отличие MS-LZSS (Microsoft LZSS) от классического LZSS (который, похоже, используется во многих играх), без которого на выходе получится не файл, а что попало.
Не поверите - очень популярный алгоритм. Во многих играх используется.
Выложил сейчас на сайт распаковщик .GPF для Snake Battle / Змеиный бой (Gamos, 1992).

Вот эти строки:
CODE
I:=($FFF + 1) - 16;
...
J:=J + ((Len And $F0) ShL 4);
Len:=(Len And $0F) + 3;

Заменить такими:
CODE
I:=($FFF + 1) - 16 - 2;
...
J:=J + ((Len And $0F) ShL 8);
Len:=((Len And $F0) ShR 4) + 3;

И всё.
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
-=CHE@TER=-
Feb 9 2018, 09:14
Сообщение #149


Walter Sullivan
***

Группа: Root Admin
Сообщений: 1,130
Регистрация: 4-February 08
Пользователь №: 3
Спасибо сказали: 269 раз(а)



QUOTE(Siberian GRemlin @ Feb 8 2018, 10:27) *
Только одна проблема — не хочется тратить время на вникание в код, если ты его перепишешь на Си или на Паскале с помощью допотопных AssignFile и пр. Я года с 2004 использую потоки после того как увидел, как это делается в одном из исходников основателя extractor.ru
Чтобы не раздувать холивар постараюсь его сократить. У меня к тебе такие вопросы:
1) Обоснуй чем потоки лучше, скажем, CreateFile() + CreateFileMapping()? Ты точно также можешь весь файл в память засунуть и делать с ним что угодно.
2) В чем проблема заменить (автозаменой даже можно), скажем, "BlockRead(fl, buffer, size);" на "stream.Read(buffer, size);"?
А почему ООП вообще и потоки в частности это плохо я сейчас объяснять не буду, дабы не разводить холивар - там на отдельную большую статью хватит. Вот например - обрати внимание, ООП не последние люди критикуют, хотя некоторые, конечно, личности спорные.
User is offlineProfile CardPM
Go to the top of the page
+Quote Post

8 Страниц V « < 6 7 8
Reply to this topicStart new topic
3 чел. читают эту тему (гостей: 3, скрытых пользователей: 0)
Пользователей: 0 -

 



Упрощённая версия Сейчас: 24th February 2018 - 11:36