Tunrar без DLL

Как програма, за да разопаковате * .rar архиви

Е, до точката. Разархивирайте софтуер * .rar файлове по два начина:

  1. WinRar.exe обадя от командния ред със съответните бутони
  2. да се възползват от 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 в приложението си:

  1. Включи DLL във файла ресурс, свържете файла ресурс за вашето приложение. При изтегляне, запишете DLL в отделно (за предпочитане в папка "Темп") файл; динамично зареждане на всички функции на получената DLL.
  2. Използване на помощната програма Dll2Lib, програмиране в VisualC ++.
  3. Използвайте комунални услуги DLLTools.

Първият начин, надявам се, е ясно на всички. Вторият начин ще обясня. Налице е сравнително добре позната DLL2Lib полезност. Тя, както можете да се досетите, превръща DLL библиотека * .lib-статична библиотека. Получената * .lib може да се използва свободно в приложения на Visual C ++. C ++ Builder също използва * .lib библиотека, но този опит за свързване на библиотеката поради несъвместимост на формати (говорим за тях в края) края на грешката компилатор.

Нека поговорим за последния метод. Съвсем наскоро Vga ми даде линк. за които той благодаря много. Изтеглете го, нито една от които не е необходимо, статията вече приложен съществено променени архив DLLTools.zip. Това, което трябва да изтеглите за по-нататъшна работа е.

Втори по значение е Dll2Pas полезност (като цяло напълно пренаписана). Това го превръща в самостоятелен DLL файл * .pas детайл. За да го използвате, копирате преобразуваната DDL-библиотека DLLTools директория и стартирайте програмата. Ако само един "UnRar.dll", намиращ се в директория, ползата ще създаде само един "UnRarLib.pas" файл. Отварянето на тази единица в Делфи, сложи ще видите, че той е "разделен" на няколко пресечки:

  1. Типове блокове и константи
  2. ГЛАВНИ функции и процедури
  3. ГЛАВНИ вътрешни функции и процедури
  4. Инициализация на всички функции и процедури
  5. БЛОК 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.
Функция може да не работи в някои версии на браузъри.