Tunrar nélkül dll

Hogyan program kicsomagolja * .rar archívum

Nos, az a lényeg. Csomagold szoftver * .rar fájlokat kétféle módon:

  1. WinRar.exe hívja a parancssorból a megfelelő gombok
  2. kihasználni API funkciók „UnRar.dll” könyvtár

Az első út nem írom le (mert nem tudom), fogunk összpontosítani a második. Library „unrar.dll” megtalálható a mappában, ahová telepítette WinRar vagy az archívumban, amely csatlakozik a cikket. Annak érdekében, hogy az alkalmazás dolgozni ezt a könyvtárat, dll kell helyezni akár ugyanabban a könyvtárban, mint a exe, vagy a Windows rendszer könyvtárába.

Mi sokat írni. Csökkenni fog, de még mindig az egyik UnRarFile eljárás, az első argumentum - rar-fájl, a második - a kapott könyvtárat [amely nem adja meg]:

Csak hogy a foglalás: Feltár API sokkal összetettebb, mint szeretnénk. Ezért néhány hibaellenőrzés, és a leírások a különböző közlekedési módok „kicsomagoló” szándékosan csökkentette.

A nagyobb átláthatóság érdekében, hogy mi történik, vessünk az alak a komponensek Memo és Button. Minden, ami történik a folyamat kicsomagolás az archív fogja meghatározni a Memo. Az egy gombnyomásra lesz dekompressziós:

Most meg lehet nézni UnRarFile végrehajtási eljárásokat. Remélhetőleg sok minden világossá vált.

Mielőtt bármilyen fájlt csomagold ki, megkapjuk a fejlécet. A fejléc tartalmaz egy sor olyan paramétereket: név razarhiviruemogo fájlt (fájlnév), a méret az archív (Kiszerelés), a valós méretű (UnpSize) attribútumokkal (FileAttr; általa, az úton, akkor láthatjuk, egy könyvtár, vagy sem), számos egyéb paramétereket. Ha azt szeretnénk, hogy csomagolja ki a még nem minden, hanem csak egy részét (csak az * .exe-fájlok, például), és kapcsolja be a felesleges fájlokat, akkor egyszerűen nem hívja meg a függvényt RARProcessFile.

By the way, ha szükséges, támogatja dekompressziós „egy másik fájlt.” Ehhez az utolsó argumentum RARProcessFile funkció jelzi nem nulla, és az új fájl nevét. Ne felejtsük el, hogy feltár sorban OEM kódolást.

Ha az eredmény ennek a funkciónak nulla, dekompressziós folytatódik. Ha 1, akkor leáll (nem próbáltam más értékeket is). Ezzel a funkcióval, hogy megszünteti unzipping.

Üzenet (msg) vehet nemcsak UCM_PROCESSDATA állandó, hanem UCM_NEEDPASSWORD (ha az archív helyreállítási adat) és UCM_CHANGEVOLUME (nem tudom, hogyan kell használni);

Azonban a legfontosabb marad UCM_PROCESSDATA. Ha telefonál RARProcessFile eljárás csomagold ki a fájlt részein. Amikor minden egyes ilyen rész unzipping, visszahívott függvény, amelyre a UCM_PROCESSDATA üzenetet; P2 - a méret a razarhiviruemoy.

Csomagolja ki a fájlt ugyanabba a WinRAR, azt látjuk, két állapotsorok: a felső (amely már része az archívum kicsomagolása, amely továbbra is) és alsó (mindegy képest a jelenlegi fájlt). Hogyan lehet megvalósítani az aljára, azt hiszem, számíthat, ha elolvassa a címet meg kell tudni, hogy meddig tart a kitömörítés fájlt (változóban tárolt Total, például) és megsemmisíteni az egyes egész változó (Cur, például). A visszahívás funkciót ha kap egy üzenetet UCM_PROCESSDATA, Cur hozzá a helyi P2 paramétert.

A százalékos a kicsomagoláskor az egész archívum bonyolultabb. Még tekintettel arra, hogy a mérete minden fájl elemi (UnpSize), a TRAROpenArchiveData szerkezet nincs utalás arra, hogy bármilyen típusú GlobalUnPackSize. Tehát mit kell tenni?

Mindenesetre, GlobalUnPackSize találják továbbra is szükség van. Ez úgy történik, mint ez (sokkal egyszerűbb):

És hol TUnRar.

Igen, egyetértek, amelyek egyike a végrehajtását az osztály, vagy akár több TUnRar komponens ki a kérdést. Ennek ellenére, a remény még mindig létezik az a személy, aki vállalja a végrehajtás egy normál komponens, amely nem igényel dll, megfelelően működik, és ez volt a felhasználóbarát felület.

Az egyetlen dolog, ami megakadályozza, hogy az áttétel a jelenlegi végrehajtása a PFSZ, ez - a funkció UnRarCallBack. A fogás, hogy ha kijelentem eljárást a nyilvános részén az osztály, a fordító nem engedi, hogy állítsa be a függvény paraméter RARSetCallback (). És ez nem a fordító; üzleti megállapodások hívja a Közgyűlés szintjén.

Szerencsére, a költségek csak a dolog. Az utolsó érv RARSetCallback function () - UserData: longint foglal négy bájt, akkor egy linket a komponens, hogy ...

Megmagyarázni. Tegyük fel, hogy egy osztály TUnRar. Hozzon létre egy funkció benne TUnRar.RARCallBack (msg, P1, P2. Egész szám). integer, ami végül meg fogják kapni az üzeneteket. Legyünk a TUnRar.UnRarFile () eljárás, amelynek RARSetCallback () hívás egy kis változás:

Nos UnRarCallBack fog kinézni:

Mintegy meglévő unrar

Furcsa módon, egy pár implementáció ezen komponensek láttam. Először is, egy zárt komponens ZipTV csomagban. Második - német alkatrész (nyitva!) DFUnRar (letöltés itt). Mindkettő nem túl kényelmes, nem magyar támogatási igényelnek unrar.dll.

Ha hozzá DFUnRar forrás, egy lusta rajongó, és ezt a cikket, akkor lehet, hogy egy jó alkatrész. Nos, van, sajnos, nem.

Oké! Most, hogy eltűnjön ez unrar.dll.

Búcsú DLL és hogyan lehet integrálni a DLL be kérelmet a Delphi.

Számomra, hogy őszinte legyek, még mindig nem értem, miért a sok programozó hajlamos megszabadulni a jelenléte használt dll saját könyvtárban. Azt fogja mondani, többet, I - egyike azoknak a programozók :).

Valaki talán azt akarja, hogy valamiféle autonómiát az alkalmazás (ha az alkalmazás nem találja a kívánt dll, hogy helyes-e ez a munka, hogy enyhén szólva, nem). Valaki, valószínűleg el akarja rejteni a használata fizetett (vagy ingyenes) DLL-könyvtárak (ezt, és mindenféle grafikai és programozás, és a hang [BASS, MikModdal, FMOD, ...], valamint a fizikai [Newton, ODE, tokamakká ...] motorok és kereskedelmi dll-könyvtár és ...). Valaki talán van egy csomó a C ++ és szeretné használni a Delphi; mindegyiknek megvan a maga oka. Tény, hogy használja a C-shny kód nem hozhat létre dll. De ez a téma egy másik cikk ... (oké, hogy ezt a lehetőséget, hogy írjon egy pár szót később).

Tudom, hogy csak három módon integrálni DLL be a kérelmet:

  1. Tartalmazza DLL a forrás fájlt, link a forrás fájlt az alkalmazás. Amikor le, kivéve a DLL egy külön (lehetőleg egy mappát „Temp”) file; dinamikusan betölteni az összes funkciót a kapott DLL.
  2. Használja a közüzemi Dll2Lib, programozás VisualC ++.
  3. Segédprogramok használata DLLTools.

Az első út, remélem, világos mindenki számára. A második út fogom magyarázni. Van egy viszonylag jól ismert DLL2Lib segédprogramot. Ő, ahogy sejteni lehet, átalakítja DLL-könyvtár * .lib statikus könyvtár. A kapott * .lib szabadon használható alkalmazások Visual C ++. Builder C ++ is használja a * .lib könyvtár, de ez a kísérlet a összekapcsolja a könyvtár összeegyeztethetetlensége miatt formátumú (beszélni velük a végén) végén a fordító hibát.

Beszéljünk az utóbbi módszer. Legutóbb Vga adta a link. amiért nagyon köszönöm. Töltsd le, sem az, ami nem szükséges, a cikkben már csatolt jelentősen módosította archív DLLTools.zip. Ennyi van, hogy letölteni a további munkához.

Második legfontosabb jelentése Dll2Pas segédprogram (ez általában teljesen átírt). Ez átalakítja azt egy önálló DLL fájl * .pas munkadarabot. Ahhoz, hogy használni, másolja az átalakított DDL-könyvtár DLLTools könyvtárba, és futtassa a segédprogramot. Ha csak egy „UnRar.dll” a könyvtár, a segédprogram létrehozni egyetlen „UnRarLib.pas” fájlt. Megnyitása a készülék a Delphi, tegye meg fogja látni, hogy ő „osztott” több blokk:

  1. Blokk típusok és konstansok
  2. BLOCK funkciók és eljárások
  3. BLOCK belső funkciók és eljárások
  4. Inicializálása az összes funkció és eljárások
  5. BLOCK deinitialization (ha szükséges)

Töltsük be néhányat. Az első blokk lépés tartalmazza az összes típusú (TRAROpenArchiveData, TRARHeaderData, TUnRarCallBack) és konstans (ERAR_END_ARCHIVE, RAR_OM_EXTRACT, RAR_EXTRACT, RAR_SUCCESS, UCM_PROCESSDATA) kapcsolatos feltár könyvtárban.

A második blokk, amíg a skip, gyors előre a harmadik kiegészítő OpenRARArchive () függvényt. Minden változó (RARHeaderData, ArcStruct, CmtBuffer) mozgassa a felületen szakasz (azaz implimentation fenti szakaszt).

Az ötödik blokk, akkor nem kell (törölni nem szükséges). Továbbra is befejezni a második és a negyedik. Ha a DLL betöltése dinamikusan, akkor nem hogy egy hatalmas erőfeszítést, hogy teljes ezeket a blokkokat. Ha betölti statikusan (mint a mi esetünkben), akkor jön a támogatás Static2DynDLL segédprogramot. Használja úgy, mint ez:

K: Miért kapott modul egészíti exe 2-szer kisebb, mint az eredeti DLL? Talán azért, mert, hogy eltávolítja a felesleges DLL darab kódot?

Válasz: Nem Valójában használt felfújási-tömörítést. Ez a megközelítés takarít nem csak a méret a exe, hanem foglalják a helyet a memóriában.

K: Miért kapott modul 2-szer több, mint az eredeti DLL?

Válasz: Annak érdekében, hogy „írni” adatokat * .pas-fájlt használ egy sor bájt. A leírás 1bayta adat megy 4bayta (karakter) szöveg. mert Az eredeti fájl tömörítve körülbelül 2-szer, és 4bayta költöttek az egyes byte a rekord, akkor: result = méret (DLL) / 4 = 2 * 2 * méret (DLL) ... Ezek nem valószínű, hogy rögzíteni kell másképp!

Válasz: Vagy néhány funkciót nem DLL, vagy statikus függvény helytelenül alakítjuk segédprogram Static2DynDLL. Például, ha a statikus függvény így néz ki:

átalakítja a segédprogram: MessageBox: = GetProcedure ( 'MessageBox'); Minden olyan kérdés, Benjamin Rosseaux!

Kérdés: Az én DLL „varrt fel” források. Mint tudod feltölteni őket onnan?

Válasz: Fogalmam sincs. Meg lehet tanulni a forráskódot és a fenti cikkben adni ezt a képességet TDLLLoader (ha lehetséges).

K: Mi késztetett arra, hogy változtatni?

Mindent! Sok szerencsét! Itt vagyok csak néhány nappal egy cikkében azt írta, és a közművek, kiesett a barátnőjével; Azt mondja, minden időt töltök a számítógép előtt, az ő figyelmét szinte nem fizetnek. Mindeközben!

Alkalmazás (hogyan kell használni a C ++ kódot Delphi)

Ja, majdnem elfelejtettem, hogy ő megígérte, hogy beszélni róla. Rendben. A legegyszerűbb és legmegbízhatóbb módja - kapcsolja be a C ++ kódot a DLL, amelyeket fel lehet használni az alkalmazás, minden gond nélkül.

Másodszor, akkor megpróbálja lefordítani a kódot egy C ++ OMF formátumban fordítóprogramok és fogadott fájlokat * .obj összekapcsolni az alkalmazást a direktíva. „Mi a formátum - OMF” - kérjen egy pár. Az a tény, hogy van két inkompatibilis formátumok * .obj fájlokat: OMF és COFF. Az elsőnél a Delphi, C ++ Builder, Watcom C ++, Intel C ++ Compiler, ..., a másodikkal a Visual C ++ és más fordítók.

Akkor azonban felhasználhatja Coff2Omf segédprogramot. A használatához hozzon létre egy fájlt, például a „Execute.bat” az alábbiak szerint:

Ezután futtassa a fájlt, hogy végre kell kap OMF formátumban.

De, ha még mindig van lehetőség az összeállításhoz a OMF-fordító, majd fordítsuk le a. Itt egy lista a szabad C ++ fordító. Tudod letölt egy ingyenes Borland C ++ fordító.

Letöltés? Most, a kedvéért az érdeklődés, próbálja meg, hogy néhány C ++ modult, fordítsd le, és, ha szükséges, hogy átalakuljon a OMF. Most próbálja meg a linket, hogy a Delphi ... hiba? Én is így gondoltam! Ez szinte szó szerint, amit ez alkalommal írja Kvant offline RSDN site:

Delphi megérti OMF object fájlokat, és akkor is csak bizonyos megszorításokkal. Korlátozások, főleg 3 dolog:

Még mindig vannak korlátozások a szakasz nevét, TLS, stb Azonban a legtöbb esetben elegendő emlékeztetni csak azok a fenti 3. korlátozásokat, hogy egy működőképes OMF-obektnik nélkül harmadik fél segédprogramok.

Azt javaslom, hogy nézd meg a dokumentációt és a forráskód eszközök OMF2D által EliCZ.

Most pontosan mindent!

Ui Megkérdezhetem ebben a témában nem kell semmit, mert Nem hivatkoznak a kérelmet a Delphi-akár egyetlen obektnika írt C; Kapott összes információt az interneten, és VGA szó.

Idő Online: GMT mínusz 05:00

Ha azt észleli, helyesírási hibát ezen az oldalon, egyszerűen jelölje ki a hibát az egérrel, és nyomja meg a Ctrl + Enter.
Funkció nem működik bizonyos változatai böngészők.