Tunrar без DLL
Как програма, за да разопаковате * .rar архиви
Е, до точката. Разархивирайте софтуер * .rar файлове по два начина:
- WinRar.exe обадя от командния ред със съответните бутони
- да се възползват от API функции "UnRar.dll" библиотека
Първият начин Няма да описвам (защото аз не знам), ще се съсредоточим върху втория. Библиотека "unrar.dll" може да се намери в папката, където сте инсталирали WinRar или в архива, който е прикрепен към статията. За да може приложението да работи с тази библиотека, DLL трябва да бъде поставен в същата папка, като EXE, или в системната папка на Windows.
Ще пиша много. Ще бъде намалена, макар и все още една процедура UnRarFile, първият аргумент е - RAR файл, а вторият - в резултат на директория [които не могат да Посочете]:
Просто си направите резервация: Unrar API е по-сложна, отколкото бихме искали. Поради това някои проверка за грешки, както и описание на различните видове "разархивиране" Аз умишлено занижени.
За по-голяма прозрачност на това, което се случва, да приеме формата, с бележка на компоненти и бутон. Всичко, което се случва в процеса на разопаковане на архива ви ще бъде фиксиран в бележката. Само с едно натискане на един бутон ще бъде декомпресия:
Сега можете да гледате процедури за изпълнение UnRarFile. Надяваме се, че много стана ясно.
Преди да разархивирате всеки файл, получаваме заглавката. Заглавието съдържа набор от параметри: име razarhiviruemogo файл (име), размера на архива (PackSize), реалния размер (UnpSize), файлови атрибути (FileAttr; от него, между другото, можете да видите директория или не), и редица други параметри. Ако искате да разархивирайте не е всичко, а само част (само * .exe-файлове, например) и да се превърне боклуци файлове, а след това просто не се обадите на функция RARProcessFile.
Между другото, ако е необходимо, се поддържа от декомпресия "в друг файл." За да направите това, последната функция аргумент RARProcessFile не показва нула, а новото име на файла. Не забравяйте, че в разнищвам линия в OEM кодиране.
Ако резултатът от тази функция е нула, декомпресия продължава. Ако 1, а след това го спира (не се опита други стойности). Използвайте тази функция, за да се позволи да отмени разархивирате.
Съобщение (MSG) може да поеме не само UCM_PROCESSDATA постоянно, но UCM_NEEDPASSWORD (когато записа архив възстановяване) и UCM_CHANGEVOLUME (не знам как да се използва);
Въпреки това, най-важното си остава UCM_PROCESSDATA. Когато се обадите процедура RARProcessFile да разархивирате файла на части. При всяка такава част разархивирате, функция за обратно извикване извиква с съобщение UCM_PROCESSDATA; P2 - размера на razarhiviruemoy.
Разопаковайте файла в един и същи WinRAR, виждаме две статус барове: горната част (която вече е част от архива е разопакован, която все още остава по-ниско) и (все едно по отношение на текущия файл). Как да се прилагат на дъното, според мен, се очаква, когато четете заглавието, което трябва да се знае колко време е необходимо декомпресирания файл (съхранява в променлива Обща, например) и унищожи променливата на някои число (CUR, например). Функцията обр при получаване на съобщение UCM_PROCESSDATA, Cur за добавяне на локален параметър P2.
Изчислява се процентът на декомпресиране целия архив е по-сложно. Дори и като се има предвид факта, че размерът на всеки файл е начално (UnpSize), в TRAROpenArchiveData структура никакъв намек, че всякакъв вид GlobalUnPackSize. И така, какво да правя?
Във всеки случай, GlobalUnPackSize намерите все още се нуждаят. Това се прави по този начин (много по-опростен):
И къде TUnRar.
Да, съгласен съм, нито една от които с изпълнението на класа или дори повече TUnRar компонент не може да става. Въпреки това, все още съществува надежда човек, който ще се заеме с изпълнението на нормален компонент, който не се нуждае от DLL, работи добре и дали е лесен за употреба интерфейс.
Единственото нещо, което пречи на преноса на текущото изпълнение на ООП, това е - функция UnRarCallBack. Уловката е, че ако обяви процедура в публичната част на класа, компилаторът няма да позволи да го настроите като параметър функция RARSetCallback а (). И това не е в компилатора; бизнес споразумения изискват от нивото на събрание.
За щастие, цената е просто нещо. Функцията за последен аргумент RARSetCallback () - UserData: longint, заема четири байта, можете да поставите линк към компонента, за да го ...
Обяснете. Да предположим, че имаме класа TUnRar. Създаване на функция в него TUnRar.RARCallBack (MSG, Р1, Р2. Цяло число). число, което в крайна сметка ще получи всички съобщения. Нека бъдем като TUnRar.UnRarFile () процедура, при която RARSetCallback () се обадя малко промяна:
Ами UnRarCallBack ще изглежда така:
За съществуващите разнищвам
Странното е, че няколко реализации на тези компоненти, което съм виждал. Първо, затворен компонент в ZipTV пакет. Второ - немски компонент (отворен!) DFUnRar (изтегли от тук). И двамата не са много удобни, не се подкрепят българските изискват unrar.dll.
Ако добавите DFUnRar източник, мързелив ентусиаст и тази статия, можете да направите добро компонент. Е, аз имам, за съжаление, не.
Добре! Сега ние се отървете от този unrar.dll.
Сбогом DLL, и как да се интегрират DLL в заявление в Делфи.
За мен, за да бъда честен, все още не разбирам защо много програмисти са склонни да се отърве от присъствието на използва DLL в своята директория. Аз ще кажа повече, аз - един от тези програмисти :).
Някой вероятно иска да получи някакъв вид автономия на вашето приложение (ако приложението не намери необходимата DLL, че е правилно, че е на работа, меко казано, не е). Някой, вероятно иска да скрие използването на платени (или безплатни) с DLL библиотеки (това и всички видове графични и скриптове, и звук [BASS, MikMod, FMOD ...], и физическото [Нютон, ODE, токамак, ...] двигатели и търговско DLL библиотека, и ...). Някой вероятно има много код в C ++ и искате да го използвате в Делфи; всеки има свои собствени причини. В действителност, за да използвате кода на C-shny не може да създаде DLL. Но тази тема е друга статия ... (добре, използваме тази възможност, за да напиша няколко думи по-късно).
Знам само три начина за интегриране на DLL в приложението си:
- Включи DLL във файла ресурс, свържете файла ресурс за вашето приложение. При изтегляне, запишете DLL в отделно (за предпочитане в папка "Темп") файл; динамично зареждане на всички функции на получената DLL.
- Използване на помощната програма Dll2Lib, програмиране в VisualC ++.
- Използвайте комунални услуги DLLTools.
Първият начин, надявам се, е ясно на всички. Вторият начин ще обясня. Налице е сравнително добре позната DLL2Lib полезност. Тя, както можете да се досетите, превръща DLL библиотека * .lib-статична библиотека. Получената * .lib може да се използва свободно в приложения на Visual C ++. C ++ Builder също използва * .lib библиотека, но този опит за свързване на библиотеката поради несъвместимост на формати (говорим за тях в края) края на грешката компилатор.
Нека поговорим за последния метод. Съвсем наскоро Vga ми даде линк. за които той благодаря много. Изтеглете го, нито една от които не е необходимо, статията вече приложен съществено променени архив DLLTools.zip. Това, което трябва да изтеглите за по-нататъшна работа е.
Втори по значение е Dll2Pas полезност (като цяло напълно пренаписана). Това го превръща в самостоятелен DLL файл * .pas детайл. За да го използвате, копирате преобразуваната DDL-библиотека DLLTools директория и стартирайте програмата. Ако само един "UnRar.dll", намиращ се в директория, ползата ще създаде само един "UnRarLib.pas" файл. Отварянето на тази единица в Делфи, сложи ще видите, че той е "разделен" на няколко пресечки:
- Типове блокове и константи
- ГЛАВНИ функции и процедури
- ГЛАВНИ вътрешни функции и процедури
- Инициализация на всички функции и процедури
- БЛОК deinitialization (ако е необходимо)
Нека да попълнят някои от тях. първи блок преместите опише всички видове (TRAROpenArchiveData, TRARHeaderData, TUnRarCallBack) и константи (ERAR_END_ARCHIVE, RAR_OM_EXTRACT, RAR_EXTRACT, RAR_SUCCESS, UCM_PROCESSDATA), отнасяща се до разнищвам библиотека.
Вторият блок до каросерията, функция бързо напред трета спомагателни OpenRARArchive (). Всички променливи (RARHeaderData, ArcStruct, CmtBuffer) се движат в раздел интерфейс (т.е. частта implimentation горе).
Петият блок, ние не се нуждаем (за изтриване не е необходимо). Остава да завърши втори и четвърти. Ако DLL ви зареди динамично, а след това няма да направи огромни усилия, за да изпълните тези блокове. Ако го заредите статично (както е в нашия случай), а след това идва на помощ Static2DynDLL полезност. Използвайте го по този начин:
Въпрос: Защо е в резултат на модул добавя към EXE 2 пъти по-малко от първоначалния DLL? Дали защото, който премахва ненужните DLL парчета код?
Отговор: Не. Всъщност използва издуват компресиране. Този подход спестява не само от размера на EXE, но също така и да заемат място в паметта.
Въпрос: Защо е в резултат на модула е 2 пъти повече от първоначалната DLL?
Отговор: За да се "пишат" данни в * .pas-файл, използва масив от байтове. На описание 1bayta данни отива 4bayta (знака) на текст. защото оригиналния файл е компресиран до около 2 пъти, а 4bayta, прекарано на всеки байт на записа, а след това: резултат = размер (DLL) / 4 = 2 * 2 * размер (DLL) ... Това е малко вероятно да бъдат записани по различен начин!
Отговор: или някои от функциите не е DLL или статична функция е неправилно превръща полезност Static2DynDLL. Например, ако статичното функцията изглежда така:
преобразува полезност: MessageBox: = GetProcedure ( "MessageBox '); Всички въпроси към Бенджамин Rosseaux!
Въпрос: В моята DLL "зашити" ресурси. Както можете да ги качите от там?
Отговор: Нямам представа. Може да изучавате изходния код и по-горе статия, за да добавите тази възможност в TDLLLoader (ако е възможно).
Q: Какво ви направи промени?
Всичко! Желая ти късмет! Аз съм тук, до няколко дни една статия той пише и комуналните услуги, падна с приятелката си; Той казва, че през цялото време прекарвам пред компютъра, вниманието й почти не плащат. През цялото това време!
Заявление (как да използвате C ++ код в Делфи)
О, щях да забравя, че той е обещал да говоря за това. Добре. Най-лесният и най-сигурният начин - да се превърне в C ++ код за DLL, който може да се използва в молбата Ви, без никакви проблеми.
На второ място, можете да се опитате да компилирате кода в компилатори формат C ++ лицево-челюстната и получени файлове * .obj за свързване на приложението, за да ви директива. "Какъв е форматът е - лицево-челюстната" - питам няколко. Фактът, че има две несъвместими формати * .obj-файлове: лицево-челюстната и COFF. Първият се използва в Delphi, C ++ Builder, Watcom C ++, C ++ Intel Compiler, ..., а вторият се използва в Visual C ++ и други компилатори.
Можете обаче да използвате Coff2Omf полезност. За да го използвате, да създадете файл, например, "Execute.bat", както следва:
След това пуснете файла, за да се изпълни, трябва да получите лицево-челюстната файлов формат.
Но, ако все още имате възможност да я компилирате в лицево-челюстната-компилатор, а след това да го компилирате инча Ето списък на свободен C ++ компилатори. Можете да изтеглите безплатно Borland C ++ компилатор.
Изтегляне? Сега, в името на интереси, се опита да отнеме известно C ++ модул, той събира и, ако е необходимо, за да се превърне в OMF. Сега се опитайте да го свържете към Делфи ... Грешка? Така си и мислех! Това е почти дума по дума какво пише по този повод Квант е на линия RSDN сайт:
Delphi разбира лицево-челюстната обектните файлове, а след това само с определени ограничения. Ограничения, предимно 3 неща:
Все още има ограничения по отношение на имената на разделите, TLS, и т.н. Въпреки това, в повечето случаи е достатъчно да се има предвид само тези 3 по-горе ограничения, за да получите работеща лицево-челюстната-obektnik без да се използват от трети страни комунални услуги.
Аз препоръчвам да погледнете инструменти Кодекса на документация и изходни OMF2D от EliCZ.
Сега точно всичко!
Послепис Аз питам по тази тема не се нуждае от нищо, защото Аз не се свържат прилагането на Delphi-дори само една obektnika написан на C; Цялата информация от този сайт и с VGA думи.
Време във форума: GMT минус 05:00
Ако забележите правописна грешка на тази страница, просто маркирайте грешката с мишката и натиснете Ctrl + Enter.
Функция може да не работи в някои версии на браузъри.