Tunrar fără dll

Cum program pentru a despacheta * arhive .rar

Ei bine, până la punctul. Dezarhivați software-ul * fișiere .rar în două moduri:

  1. WinRar.exe suna din linia de comandă cu tastele corespunzătoare
  2. pentru a profita de API funcții de bibliotecă „UnRar.dll“

Primul mod nu voi descrie (pentru că eu nu știu), ne vom concentra pe a doua. Biblioteca „unrar.dll“ pot fi găsite în folderul unde ați instalat WinRar sau în arhivă, care este atașat la articol. Pentru ca cererea de a lucra cu această bibliotecă, dll trebuie să fie plasate fie în același folder ca exe, sau în folderul de sistem Windows.

Vom scrie foarte mult. Va fi redusă, deși încă o procedură UnRarFile, primul argument este - RAR-fișier, al doilea - directorul rezultat [care nu se poate specifica]:

Doar a face o rezervare: Unrar API este mult mai complexă decât ne-am dori. Prin urmare, unele eroare de verificare, precum și descrieri ale diferitelor moduri de „dezarhivare“ Am coborât în ​​mod deliberat.

Pentru o mai mare transparență a ceea ce se întâmplă, să ia cu privire la forma componentelor Memo și butonul. Tot ceea ce se întâmplă în procesul de despachetare arhiva va fi fixat în Memo. La atingerea unui buton va fi decompresie:

Acum puteți viziona procedurile de punere în aplicare UnRarFile. Din fericire, mult a devenit clar.

Înainte de a dezarhiva orice fișier, vom obține antetul. Antetul conține un set de parametri: fișier razarhiviruemogo numele (filename), dimensiunea arhivei (PackSize), dimensiunea reală (UnpSize), atributele de fișier (FileAttr, de el, de altfel, puteți vedea un director sau nu), un număr de alți parametri. Dacă doriți să dezarhiva arhiva nu este tot, ci doar o parte (numai * .exe-fișiere, de exemplu) și de a transforma fișierele nedorite, atunci pur și simplu nu apela funcția RARProcessFile.

Prin modul în care, dacă este necesar, susținută de decompresie „într-un alt fișier.“ Pentru a face acest lucru, ultima funcție argument RARProcessFile nu indică zero, iar numele fișierului nou. Nu uitați că, în linie UNRAR în codarea OEM.

În cazul în care rezultatul acestei funcții este zero, decompresie continuă. Dacă 1, apoi se oprește (nu a încercat alte valori). Utilizați această funcție pentru a permite anularea dezarhivare.

Mesaj (msg) poate lua nu numai UCM_PROCESSDATA constantă, dar UCM_NEEDPASSWORD (în cazul în care înregistrarea de recuperare arhiva) și UCM_CHANGEVOLUME (nu știu cum să folosească);

Cu toate acestea, cel mai important rămâne UCM_PROCESSDATA. Atunci când apelați procedura RARProcessFile poate dezarhiva fișierul în părți. Când dezarhivare fiecare porțiune, funcție callback apelată cu mesajul UCM_PROCESSDATA; P2 - dimensiunea razarhiviruemoy.

Despachetați fișierul în același WinRAR, vom vedea două bare de stare: partea de sus (care este deja parte a arhivei este despachetat, care rămâne în continuare) și inferioară (toate aceeași raport cu fișierul curent). Cum să pună în aplicare în partea de jos, cred, se așteaptă ca atunci când citesc titlul trebuie să știți cât timp este nevoie fișierul decomprimat (stocat în variabila totala, de exemplu) și anihila variabila ıntreg (CUR, de exemplu). Funcția Callback la primirea unui mesaj UCM_PROCESSDATA, pentru a adăuga pe Cur un P2 parametru local.

Se calculează procentul de decomprimare întreaga arhivă este mai complicată. Chiar și având în vedere faptul că dimensiunea fiecărui fișier este elementar (UnpSize), în structura TRAROpenArchiveData nici un indiciu că orice tip de GlobalUnPackSize. Deci, ce să fac?

În orice caz, GlobalUnPackSize găsi încă nevoie. Acest lucru se face ca aceasta (mult simplificată):

Și unde TUnRar.

Da, sunt de acord, nici una dintre care punerea în aplicare a clasei sau chiar mai mult componenta TUnRar iese din discuție. Cu toate acestea, speranța există încă o persoană care va efectua punerea în aplicare a unei componente normale, care nu are nevoie de dll, funcționează corespunzător și a fost interfata user-friendly.

Singurul lucru care împiedică transferul de implementarea curentă a OEP, este - funcția UnRarCallBack. Captura este că, dacă declarați o procedură în secțiunea publică a clasei, compilatorul nu va permite setarea acesteia ca un parametru RARSetCallback funcție (). Și nu e în compilator; acorduri de afaceri apel la nivel de asamblare.

Din fericire, costul este doar lucru. Funcția RARSetCallback ultimul argument () - UserData: longint, ocupă patru octeți, puteți plasa un link către componenta să-l ...

Explică. Să presupunem că avem o clasă TUnRar. Creați o funcție în ea TUnRar.RARCallBack (msg, P1, P2. Integer). număr întreg, care în cele din urmă va primi toate mesajele. Să fie ca TUnRar.UnRarFile () procedura în care RARSetCallback () numesc o mică schimbare:

Ei bine, UnRarCallBack va arăta astfel:

Despre UnRAR existente

Destul de ciudat, o pereche de implementari ale acestor componente l-am văzut. În primul rând, o componentă închisă în pachetul ZipTV. În al doilea rând - componenta germană (open!) DFUnRar (descarcă aici). Ambele nu sunt foarte confortabile, nu susțin românul necesită unrar.dll.

Dacă adăugați sursa DFUnRar, un entuziast leneș și acest articol, puteți face o componentă bună. Ei bine, am, din păcate, nr.

Bine! Acum vom scăpa de această unrar.dll.

Adio DLL, și cum să se integreze DLL într-o aplicație în Delphi.

Pentru mine, să fiu sincer, încă nu înțeleg de ce o mulțime de programatori au tendința de a scăpa de prezența în directorul dll utilizat său. Voi spune mai mult, eu - unul dintre acei programatori :).

Cineva, probabil, vrea să obțină un fel de autonomie a cererii dvs. (în cazul în care cererea nu găsește dll necesară, este corect, este de a lucra, să-l puneți blând, nu este). Cineva, probabil, dorește să ascundă utilizarea plătite (sau gratuit) Dll-biblioteci (acest lucru și tot felul de grafice și de scripting, și sunet [BASS, MikMod, FMOD, ...], iar fizic [Newton, ODE, Tokamak, ...] motoare și comercial-bibliotecă dll, și ...). Cineva are, probabil, o mulțime de cod în C ++ și doriți să-l folosească în Delphi; fiecare are propriile sale motive. De fapt, pentru a folosi codul C-shny nu poate crea dll. Dar acest subiect este un alt articol ... (bine, să ia această ocazie pentru a scrie câteva cuvinte mai târziu).

Cunosc doar trei moduri de a integra DLL în aplicația dumneavoastră:

  1. Includeți DLL în fișierul de resurse, link-ul fișierul de resurse la cererea dumneavoastră. Când descărcați, salvați DLL într-un fișier separat (de preferință, într-un „Temp“ dosar); încărca dinamic toate funcțiile DLL rezultat.
  2. Utilizați utilitarul Dll2Lib, programarea în VisualC ++.
  3. Utilizați utilități DLLTools.

Prima cale, sper, este clar pentru toți. A doua cale, voi explica. Există o destul de bine-cunoscut de utilitate DLL2Lib. Ea, așa cum s-ar putea ghici, convertește DLL-bibliotecă *-lib statică bibliotecă. Rezultată * .lib poate fi utilizat în mod liber în aplicații pentru Visual C ++. Builder C ++ utilizează, de asemenea, la sfârșitul anului * bibliotecă, dar .lib această încercare de a lega biblioteca din cauza incompatibilității de formate (vorbesc despre ele la final) a erorii compilator.

Să vorbim despre această ultimă metodă. Cel mai recent Vga mi-a dat link-ul. pentru care multumesc mult. Descărcați-l, dintre care nici unul nu este necesară, articolul deja atașat arhiva modificată în mod substanțial DLLTools.zip. Asta e, trebuie să descărcați pentru lucrări suplimentare.

În al doilea rând, în importanță este de utilitate Dll2Pas (aceasta este, în general, complet rescris). Ea îl convertește într-un fișier DLL independent * .pas piesei de prelucrat. Pentru a-l utiliza, copiați convertit directorul DLLTools DDL-bibliotecă și executați utilitarul. Dacă numai un singur „UnRar.dll“, situat într-un director, utilitarul va crea un singur „UnRarLib.pas“ fișier. Deschiderea acestei unități în Delphi, a pus veți vedea că el este „împărțit“ în mai multe blocuri:

  1. TIPURI DE BLOCK și CONSTANTE
  2. functii si proceduri BLOCK
  3. functii si proceduri interne BLOCK
  4. Inițializarea tuturor funcțiilor și procedurilor
  5. BLOC deinitialization (dacă este necesar)

Să completați în unele dintre ele. Prima mutare bloc descrie toate tipurile (TRAROpenArchiveData, TRARHeaderData, TUnRarCallBack) și constante (ERAR_END_ARCHIVE, RAR_OM_EXTRACT, RAR_EXTRACT, RAR_SUCCESS, UCM_PROCESSDATA), referitor la biblioteca UnRAR.

Al doilea bloc, până când bena, transmite rapid treia auxiliar OpenRARArchive () funcție. Toate variabilele (RARHeaderData, ArcStruct, CmtBuffer) se deplasează în secțiunea de interfață (adică secțiunea implimentation de mai sus).

Al cincilea bloc, nu avem nevoie (pentru a șterge nu este necesar). Rămâne de a finaliza doua și a patra. Dacă DLL dumneavoastră vă încărca dinamic, atunci nu va face un efort imens pentru a finaliza aceste blocuri. Dacă încărcați static (la fel ca în cazul nostru), apoi vine în ajutorul Static2DynDLL utilitate. Utilizați-l astfel:

Î: De ce este modulul rezultat se adaugă la exe de 2 ori mai mică decât DLL originală? Este pentru că elimină bucăți DLL inutile de cod?

Raspuns: Nu. fapt utilizat umflã-compresie. Această abordare economisește nu numai dimensiunea de exe, dar, de asemenea, ocupă spațiu în memorie.

Î: De ce este modulul rezultat este de 2 ori mai mult decât DLL originale?

Răspuns: Pentru a „scrie“ date în * .pas-fișier, utilizează o serie de octeți. La descrierea 1bayta de date merge 4bayta (caractere) textului. pentru că fișierul original este comprimat la aproximativ 2 ori, și 4bayta petrecut pe fiecare octet al înregistrării, atunci: rezultatul = mărimea (DLL) / 4 = 2 * 2 * dimensiune (DLL) ... Acestea sunt puțin probabil să fie înregistrate în mod diferit!

Răspuns: Fie unele dintre funcțiile DLL nu este, sau funcția statică a fost transformată în mod incorect Static2DynDLL de utilitate. De exemplu, în cazul în care funcția statică arată astfel:

convertește utilitate: messagebox: = GetProcedure ( 'MessageBox'); Toate întrebările lui Benjamin Rosseaux!

Întrebare: În DLL mea „cusute“ resurse. Pe măsură ce le puteți încărca de acolo?

Raspuns: Nu am nici o idee. Puteți studia codul sursă și articolul de mai sus pentru a adăuga această capacitate în TDLLLoader (dacă este posibil).

Q: Ce-a făcut să te schimbi?

Totul! Mult noroc pentru tine! Sunt aici, până acum câteva zile un articol el a scris și utilități, a căzut cu prietena lui; El spune tot timpul îmi petrec la calculator, atenția ei aproape nu plătesc. În tot acest timp!

Aplicație (cum se utilizează codul C ++ în Delphi)

Oh, aproape am uitat că el a promis să vorbească despre asta. Bine. Cel mai simplu și mai sigur mod - de a transforma codul C ++ pentru DLL, care pot fi utilizate în aplicația dumneavoastră, fără nici o problemă.

În al doilea rând, puteți încerca să compileze codul într-un format C ++ OMF compilatoare, și a primit fișiere * .obj pentru a conecta aplicația la directiva dumneavoastră. „Care este formatul este - OMF“ - cere câteva. Faptul că există două formate incompatibile * .OBJ-files: OMF și COFF. Primul este folosit în Delphi, C ++ Builder, Watcom C ++, Intel C ++ Compiler, ..., al doilea este folosit în Visual C ++ și alte compilatoare.

Poti, cu toate acestea, utilizarea de utilitate Coff2Omf. Pentru a-l utiliza, de a crea un fișier, de exemplu, „Execute.bat“, după cum urmează:

Apoi, executați fișierul pentru a executa, ar trebui sa format de fișier OMF.

Dar, dacă mai aveți opțiunea de a compila în OMF-compilator, apoi compila în. Iată o listă de liber C ++ compilatoare. Puteți descărca un compilator gratuit Borland C ++.

Descărcări? Acum, de dragul de interes, încercați să ia unele C ++ modulul, compilați-l și, dacă este necesar, să-l transforme în OMF. Acum, încercați să-l lega la Delphi ... Eroare? M-am gândit atât! Acesta este aproape cuvânt cu cuvânt ceea ce cu această ocazie, scrie Kvant este offline site-ul RSDN:

Delphi înțelege fișiere obiect OMF, și apoi numai cu anumite restricții. Restricții, în principal, 3 lucruri:

Există încă restricții privind denumirile secțiunilor, TLS, etc. Cu toate acestea, în cele mai multe cazuri, este suficient să se aibă în vedere doar cele 3 de mai sus limitări, pentru a obține un funcțional OMF-obektnik fără a utiliza utilități terțe părți.

Vă recomandăm să se uite la documentație și instrumente de cod sursă OMF2D de EliCZ.

Acum exact totul!

P.S. Întreb pe acest subiect nu are nevoie de nimic, pentru că Nu se leagă aplicația la Delphi chiar și un singur obektnika scris în C; Toate informațiile obținute de pe Internet și cu cuvinte vga.

Timp Online: GMT minus 05:00

Dacă observați o eroare de ortografie pe această pagină, pur și simplu evidențiați eroarea cu mouse-ul și apăsați pe Ctrl + Enter.
Funcția poate să nu funcționeze în anumite versiuni de browsere.