Ru-Board.club
← Вернуться в раздел «Программы»

» FreeArc: бесплатный open-source архиватор - Часть 3

Автор: Bulat_Ziganshin
Дата сообщения: 29.08.2010 12:17
Profrager
т.е. от 23-го ещё работала?

Добавлено:
кстати, может проблемы с вызовом DllMain, я ведь её даже не экспортирую. в любом случае, мне не помешал бы exe-шник на котором можно проверить. либо ещё лучше я выложу исходники а ты сам проверь какие изменения привели к проблемам. ты компиляцию unarc.dll освоил?
Автор: Profrager
Дата сообщения: 29.08.2010 12:45
Bulat_Ziganshin

Цитата:
т.е. от 23-го ещё работала?

В общем-то я использовал dll более старую - ты тогда выкладывал отдельно с введением более подробных ошибок. Но сейчас попробовал и от 23 августа - работает. Видимо все же все это из-за DllMain.

Цитата:
кстати, может проблемы с вызовом DllMain, я ведь её даже не экспортирую

По идее DllMain должна быть в поле EntriPoint dll'ки. И необходимости в ее экспорте нет. В PE Editor'е посмотрел - EntriPoint в той же позиции, что и в предыдущих dll, и внутренности вроде похожие. Видимо инициализация dll у меня при загрузке вручную несколько некорректно сделана. Хотя все другие dllки норм грузятся.

Цитата:
мне не помешал бы exe-шник на котором можно проверить

мне тоже)) Лень делать host-процесс к ISDone.dll) Запускаю все через Inno) и всякими MessageBox'ами в dllке определяю проблемное место.

Цитата:
либо ещё лучше я выложу исходники а ты сам проверь какие изменения привели к проблемам.

было бы не плохо. Но только я сегодня на день варенья иду) Так что посмотреть только завтра к вечеру смогу.

Цитата:
ты компиляцию unarc.dll освоил?

да компилял когда-то, осталось вспомнить) думаю с этим проблем не будет.

Добавлено:
фиг знает..все вроде как положено..

Код: FUNCTION InitializeLibrary:BOOLEAN;
BEGIN
RESULT:=FALSE;
@DLLProc:=ConvertPointer(ImageNTHeaders.OptionalHeader.AddressOfEntryPoint);
IF DLLProc(CARDINAL(ImageBase),DLL_PROCESS_ATTACH,NIL) THEN BEGIN
RESULT:=TRUE;
END;
END;
Автор: Bulat_Ziganshin
Дата сообщения: 29.08.2010 13:18

Цитата:
фиг знает..все вроде как положено..

а без неё нормально работает? или если CARDINAL(ImageBase) заменить на nil?

может я полученный хендл неправильно использую, хотя сделал как ты сказал:

HINSTANCE hinstUnarcDll = NULL; // unarc.dll instance

// Запомним хендл unarc.dll, необходимый нам для правильной загрузки других dll
extern "C" BOOL WINAPI DllMain (HINSTANCE hinstDll, DWORD fdwReason, LPVOID lpvReserved)
{
if (fdwReason == DLL_PROCESS_ATTACH)
hinstUnarcDll = hinstDll;
return TRUE;
}

... GetModuleFileNameW (hinstUnarcDll, path, MY_FILENAME_MAX);
Автор: datato
Дата сообщения: 29.08.2010 20:41
Что делать, FreeArc не хочет разделять файл на тома. В FreeArc можно выставить настройку разделять на тома размером в: [и можно выбрать размер], но почему-то у меня это не работает, FreeArc лепит все в один кусок. Можно ли это как-то исправить, или прийдется жать каждый архив отедльно?
Автор: Bulat_Ziganshin
Дата сообщения: 29.08.2010 20:43

Цитата:
В FreeArc можно выставить настройку разделять на тома

как?
Автор: datato
Дата сообщения: 29.08.2010 20:54
Автор: Bulat_Ziganshin
Дата сообщения: 29.08.2010 21:10
во-первых, переключи программу на русский. во-вторых, солид-блоки - это не тома, читай документацию
Автор: Profrager
Дата сообщения: 29.08.2010 22:15
Bulat_Ziganshin

Цитата:
а без неё нормально работает?

гы)




Цитата:
или если CARDINAL(ImageBase) заменить на nil?

А вот с "0" вместо CARDINAL(ImageBase) в DLLProc(CARDINAL(ImageBase),DLL_PROCESS_ATTACH,NIL) все распаковывается, но про facompress.dll можно забыть...оно не подцепляется, если рядом лежит.

Добавлено:
Почему же тогда вылет возникает в функции копирования юникодовской строки...Как-то оно все не стыкуется. Хендл dll'ки и копирование строк.
Хотя....у меня же не настоящий хендл Он не зарегистрирован в системе Отсюда могут быть и косяки

Добавлено:
Надо че-то придумывать...или же ложить как все белые люди unarc.dll рядом с остальными dllками..
Автор: Bulat_Ziganshin
Дата сообщения: 29.08.2010 22:34
поручик Ржевский был бааальшой выдумщик
Автор: Profrager
Дата сообщения: 29.08.2010 22:47
Bulat_Ziganshin
может спешл фо ми сделаешь экспортируемую ф-ю GetDllDir или GetCurrentDir? Чтобы по дефолту при инициализации dll вызывалось GetModuleFileNameW (null, path, MY_FILENAME_MAX), а если указать в GetCurrentDir свою директорию, то он потом ее использовал для загрузки facompress.dll? Хотя тогда для exe'шников (arc.exe, freearc.exe) надо что-то придумывать..у них то нет инициализации как у dll..

Добавлено:
млин, не Get.., а Set..
Автор: Profrager
Дата сообщения: 30.08.2010 07:28
видимо вчера я был не особо трезв Ерунду какую-то писал) Не над ничего добавлять или менять.. я просто хендл своей дллки буду передавать в unarc.dll и все должно быть нормально).
Попробовал так..распаковывается, но facompress.dll опять не хочет цепляться Хотя если unarc.dll загружать стандартным сособом через LoadLibrary все отлично подцепляется)
Так что в общем то с твоей стороны все работает)
Автор: qqqbbb
Дата сообщения: 30.08.2010 07:40
Алгоритм сжатия wav файлов не всегда нормально работает. Есть 333мб wav файлов - сжатие 99,5%, если удалить wav из arc.groups сжатие 73%
Автор: Bulat_Ziganshin
Дата сообщения: 30.08.2010 07:42
qqqbbb
дай lt на обоих архивах и загрузи эти файлы куда-нибудь чтоб я мог посмотреть
Автор: qqqbbb
Дата сообщения: 30.08.2010 12:48

Цитата:
загрузи

http://rghost.ru/2482787

Когда сжимаешь wav файлы(любые) профиль best asymmetric сжимает хуже чем профиль normal
Автор: Bulat_Ziganshin
Дата сообщения: 30.08.2010 12:50

Цитата:
Когда сжимаешь wav файлы(любые) профиль best asymmetric сжимает хуже чем профиль normal

ну да. зато скорость распаковки увеличивается
Автор: V2driver
Дата сообщения: 30.08.2010 13:28
qqqbbb
best asymmetric это не значит Бест сжатие..
А лучший асимметрик - тоесть большая скорость распаковки..
Автор: Profrager
Дата сообщения: 30.08.2010 16:30
Bulat_Ziganshin
выложи плиз исходники, хочу все же разобраться в чем проблема..истина уже где-то рядом..)
Автор: Bulat_Ziganshin
Дата сообщения: 30.08.2010 16:40
Profrager
http://rghost.ru/2485289
Автор: Profrager
Дата сообщения: 30.08.2010 17:35
Bulat_Ziganshin
1) большое спасибо)
2) после компиляции с этой dll у меня facompress.dll стала цепляться при любом способе загрузки unarc.dll.
В функции LoadFromDLL в unarc.dll добавил MessageBoxW(0,path,0,0) дабы понаблюдать за получаемой строкой пути. При ручной загрузке в DllMain передаю хендл самой ISDone.dll, MessageBoxW из unarc.dll верно отображает путь к isdone.dll. Если же гружу через LoadLibrary, MessageBoxW показывает путь к unarc.dll. Т.е. все как и должно было быть) Не знаю почему до этого с присланной тобой dll не работала прямая загрузка в память.
3) отчего-то размер dll после компиляции на 10кб больше того, что ты присылал (было 295'424, стало 305'664), чего-то добавил? Или у меня версия компилятора другая?
4) есть небольшая проблемка - после завершения (или отмены) установки facompress.dll не удаляется из папки темп. Видно, что setup секунду где-то висит, ждет когда она освободится, но так и не дождавшись выходит, оставив в темпе. Надо бы как-то выгружать ее при выходе..

Добавлено:
Bulat_Ziganshin
Еще вот мысли на счет ImageBase dll'ок. У unarc.dll 61080000h - вроде как нормально, но вот на моей XP x86 до 71B00000h свободное место, может лучше разместить где-нить ближе к 70000000h? Хотя на Win7 может быть иначе. И у facompress.dll ImageBase=00400000h, что не есть хорошо, его тоже бы куда нить в конец недалеко от unarc.dll сместить, чтобы по минимому кромсать непрерывную свободноую память. И у InnoCallback.dll надо будет тож ручками сместить в конец, а то у него ImageBase=00400000h.
Автор: Profrager
Дата сообщения: 30.08.2010 19:43
или же все делать на один адрес, чтобы винда сама рассовывала в свободные места. Правда не знаю оптимально ли она их расположит, или раскидает куда попало..
Автор: Bulat_Ziganshin
Дата сообщения: 30.08.2010 20:20
вот для сравнения моя: http://rghost.ru/2487559
насчёт лишних 10 кб стало интересно, разобрался - это из-за добавления операций над Thread в C_External.cpp. Хотя всё равно непонятно, как это произошло, учитывая, что те же операции уже используются в CompressionLibrary.cpp


Цитата:
есть небольшая проблемка - после завершения (или отмены) установки facompress.dll не удаляется из папки темп. Видно, что setup секунду где-то висит, ждет когда она освободится, но так и не дождавшись выходит, оставив в темпе. Надо бы как-то выгружать ее при выходе..

наверно в той же DllMain?


Цитата:
Еще вот мысли на счет ImageBase dll'ок.

имхо надо все на ImageBase=00400000h, это ручное распределение адресов - идиотизм полнейший
Автор: Profrager
Дата сообщения: 30.08.2010 20:50
Bulat_Ziganshin

Цитата:
наверно в той же DllMain?

судя по названиям и значениям констант:

Код: DLL_PROCESS_ATTACH=1;
DLL_THREAD_ATTACH=2;
DLL_THREAD_DETACH=3;
DLL_PROCESS_DETACH=0;
Автор: Registered User
Дата сообщения: 30.08.2010 21:23

Цитата:
ведь переменные loaded, dll, mt_dll локальные для данной функции и они очистятся при следующем вызове

слово static как раз и отменяет это, сохраняя переменные до следующего вызова функции
Автор: Profrager
Дата сообщения: 30.08.2010 21:59
Registered User
я так и подумал, что зря это написал Зато теперь в курсе, что static - объявление глобальной переменной)
Автор: Bulat_Ziganshin
Дата сообщения: 31.08.2010 00:22

Цитата:
Надо обрабатывать DLL_PROCESS_DETACH.

оказывается там низя. сделал непосредственно в FreeArcExtract, пробуй: http://rghost.ru/2490120
Автор: Profrager
Дата сообщения: 31.08.2010 07:32
Bulat_Ziganshin
при любом способе загрузки в начале распаковки вылезает вот это:



Добавлено:
а без facompress.dll все распаковывается
Автор: Bulat_Ziganshin
Дата сообщения: 31.08.2010 07:49
Profrager
попробуй сам с UnloadCompressionDLLs поиграть, может там на NULL проверять надо?

Добавлено:
http://rghost.ru/2491393 - перед выходом вызывай UnloadDLL
Автор: Registered User
Дата сообщения: 31.08.2010 10:51

Цитата:
static - объявление глобальной переменной)

они все равно видны только из функции, но сохраняются между ее вызовами
Автор: Eric_Allman
Дата сообщения: 31.08.2010 13:30
Доставляю страждущим пример распаковки архива на Delphi (используя unarc.dll) с прогрессбаром.
Код не приводил в божеский вид, отдельным юнитом не оформлял, ибо там все просто.

http://dl.dropbox.com/u/4212902/freearctest.zip
Автор: Bulat_Ziganshin
Дата сообщения: 31.08.2010 13:37
Eric_Allman
большое спасибо! а unarc.pas - это мусор, который ты забыл стереть?

переведу сообщения на english и включу в дистрибут. а как твой копирайт-то указать? просто Eric_Allman?

Страницы: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970

Предыдущая тема: Opera (часть 14)


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.