Konsooli ressursiredaktor: ressursside redigeerimine EXE DLL-failides

Iga kord, kui mul on vaja luua uus ressursi dll, hakkan meeletult otsima vajalikku teavet. Väsinud sellest! Panen siia kõik, mida pean oluliseks.

Andrey Bushmani lahkel loal dubleerin selle peaaegu täielikult. Täiendan Andreylt tehtud ekraanipilte (noh, just enda jaoks) VS2015 CommunityEditioni ekraanipiltidega. Enda kommentaarid Täpsustused kirjutan kaldkirjas.
Artikkel on kirjutatud AutoCAD 2009 jaoks, kuid töötab suurepäraselt ka teistes AutoCADi versioonides.

CUI-failides kasutatavaid graafilisi kujutisi saab võtta kas välistest BMP-failidest või haldamata DLL-i ressursifailist, kuhu need kujutised paigutatakse. Teist meetodit on mugavam kasutada. Siin vaatleme, kuidas selliseid DLL-faile luua ja kuidas neid CUI-failides kasutada.

AutoCAD pikka aega (alates versioonist 2010) kasutab CUIX-vormingut kui osalised failid menüü, mis on tavaline arhiiv, mille laiendus on ümber nimetatud ZIP-ist CUIX-iks. Meie ettevõttes on aga kasutusel AutoCAD 2009 SP3, mis CUIX-iga ei tööta, kuid kasutab vanemat vormingut – CUI-faile, mille sisu on esitatud XML-vormingus.

Lisaks on alates versioonist 2015, kui ma ei eksi, AutoCADi sisse viidud kaks disainivalikut - tume teema ja kerge teema. Mõlemas kohas nähtava ikooni tegemine on väga keeruline. Ja pildi nime muutmine käigu pealt pole just kõige parem parim lahendus. Täpsemalt allpool.

Ressursi DLL-faili loomine

M.S. Visual Studio 2012 loomine uus projekt, tuginedes mallile Tühi projekt ja määrake sellele soovitud nimi:

Nüüd aknas Lahenduste uurija vajutage paremklõps hiirega projekti nimele ja valige ilmuvas kontekstimenüüs üksus Omadused. Omadustele vajalike väärtuste määramine Sihtlaiend Ja Konfiguratsiooni tüüp:

Lisaks peate projekti seadetes muutma veel ühte valikut - Sisenemispunkti puudub:

Pärast ülaltoodud muudatuste tegemist vajutage nuppu Rakenda Ja OK. Nüüd on meie veel tühja projekti atribuudid õigesti konfigureeritud. Vahekaardil Lahenduste uurija, alates kontekstimenüü projekti, valige üksus Lisa -> Uus element... ja valige kuvatavas dialoogiboksis ressursifaili mall:

Saate failile määrata mis tahes nime, meie näites jätame selle resource.rc. Vajutage nuppu Lisa. Lisatud fail sisaldab piltide loendit, mida kasutatakse meie CUI(x)-failides.

Andrey soovitab dll-i "juhitavad" pildid paigutada alamkataloogi \images. Täiesti mõistlik soovitus, kuigi mitte kriitiline. Teine küsimus on see, et soovitan tungivalt ressursse siiski paigutada, et neid saaks “arvestada” suhteline tee. Palju aitab, kui arendustööd tehakse rohkem kui ühel töökohal.

Eksperimendi korras lisame BMP failid erinevad suurused: 16x16, 24x24, 32x32, 48x48, 64x64 ja 128x128. Tööriistapalettidel olevad nupud peavad sisaldama 16x16 kujutisi, samas kui lindipalettidele asetatud nupud on suuremad. Meie test-CUI-failis paigutame ülaltoodud eraldusvõimega nuppe nii siia kui sinna, et näha erinevate suuruste kasutamise tulemust.

Täpsustus: BMP laadimine VS-i peaks olema garanteeritud. Pole GIMP-i kasutajatele parim parim uudis: BMP tuleb luua 24-bitise värvisügavusega ja salvestada ilma tihendamiseta. Kui te ei saa salvestada ilma tihendamiseta, kasutage partii teisendamine Koos kasutades FastStone'i Pildivaatur saate soovitud tulemuse hõlpsalt saavutada.

Oleks võimalik faile kopeerida PNG-vormingus AutoCAD 2009 ei saa aga CUI-failides selle vormingu pilte kasutada.

Selgitamine: Võite proovida ühendada mitte *.bmp, vaid *.ico faile. Muidugi mõned lisatöö, kuid see on võimalik.
Vanemates versioonides peaksite tausta "läbipaistvuse" tagamiseks kasutama RGB värv 192,192,192. AutoCADi vanemad versioonid käsitlevad seda läbipaistvana.
Ja siin on veel üks asi - AutoCAD2018 ei saa enam bmp-st aru ja nõuab lihtsalt png-d

Nüüd tagasi meie IDE juurde: lülituge vahekaardile Ressursivaade.

Helistage üksus elemendi Resource.rc kontekstimenüüst Lisa ressurss...

Dialoogiboksis Lisa ressurss nimekirjas Ressursi tüüp valige element Bitmap, vajutage nuppu Impordi... ja määrake BMP-failid meie varem loodud alamkataloogist \images. Saame järgmise tulemuse (välimus on absoluutselt sama nii 2012 kui 2015)

Nüüd iga elemendi jaoks vara väärtus ID tuleb isoleerida topeltjutumärgid et neid saaks edukalt kasutada meie CUI(x)-failides:

See on kõik, nüüd kompileerime oma DLL-faili (F6 klahv või menüü kaudu Ehitamine -> Ehita lahendus) .

Tsitaadi lõpp edasisi tegevusi poolt kasutades DLL-e Kui vaja, kirjutan selle hiljem üles.

Nüüd midagi enda (ja mitte ainult enda) kogemusest.

See tehnoloogia töötab suurepäraselt osaliste kohandamisfailide kasutamisel. Kui proovite luua sellist dll-i ettevõtte kohandusfaili jaoks, ei saa te olemasolevat dll-i asendada: esiteks peavad kõik kasutajad AutoCADi välja lülitama.

dll nimi peab ühtima cui(x) failinimega. Väga soovitav on panna dll faili cui(x) kõrvale. Teoreetiliselt võite selle lihtsalt tugiteele visata, kuid isiklikult pole ma kunagi midagi sellist teinud - siis tüdinete selle otsimisest.

Teemade kohta, nagu lubatud, ADN-CIS foorumi ja Autodeski spikri teabe põhjal:

  1. AutoCADi ilma teemata versioonides võeti ressursid failist cui(x) sama nimega failist.
  2. Teemadega AutoCAD-i versioonides peate iga teema jaoks looma eraldi DLL-i ressursi: hele ja tume. Vastav Ressursi DLL kasutatakse selle põhjal, millises teemas praegune hetk kohta rakendatud kasutajaliides. DLL-failide nimetamise tava nõuab, et kasutaksite kohandamisfaili nimega sama nime, kuid peate lisama ka järelliide "_light" DLL-faili jaoks, mida kasutatakse heleda teemana. Näiteks kui laadisite alla CUIx-faili nimega minumenüü.cuix, AutoCAD otsib ressursiteegi faili mymenu_light.dll, kui kasutatakse heledat teemat, ja fail mymenu.dll, kui kasutatakse tumedat teemat.

Dmitri Zagorulkin kirjeldas suurepäraselt raamatukogu koostamise järjestust, võttes arvesse kujundusteema valikut:

CUIX faili tegin üksi versioonidel 2014-2016, sellega probleeme ei olnud. Samuti tegin kaks C++ projekti ressursiikoonide DLL-idega – ühe tumeda skeemi jaoks, teise heleda skeemi jaoks. Projekti sätetes jaotises "Ehitamise sündmused – Järgusündmuste postitamine" saate sündmusi konfigureerida nii, et loodud dll-failid kopeeritakse kohe vajalikud kaustad all õige nimi. 2014. aasta versiooni kaustas - ainult "hele" dll ilma järelliiteta, versioonide 2015–2016 kaustas - "hele" järelliitega "_light", "dark" - ilma järelliiteta. Algul tegin seda ja siis konfigureerisin sama asja, kuid WIX installeri projektis. Üldiselt olenemata sellest, kuidas te seda teete, saate selle ühe korra seadistada ja siis ei pea mõtlema, kuhu ja milliseid faile on vaja kopeerida ja mida nimetada - kõik toimub automaatselt.
Kuidas AutoCAD määrab, millist DLL-i laadida:
- versioonides kuni 2014. aastani (kaasa arvatud) laaditakse ainult ikoonidega DLL, mille nimi ühtib CIUX-faili nimega. Näiteks on fail: "MyTools.cuix", selle faili ikoone otsitakse failist "MyTools.dll".
- versioonides 2015-2016, tumeda skeemi jaoks laaditakse DLL, mis vastab nimele CUIX, heleda skeemi jaoks - nimi koos järelliitega "_light". Näide: "MyTools.cuix", tumeda skeemi ikoonid: "MyTools.dll", heleda skeemi jaoks: "MyTools_light.dll".
Veel üks ebaselge punkt. Saate luua ühe ICO-faili 16x16 ja 32x32 ikoonide jaoks. Selleks tuleb ICO sisse paigutada kaks vastavat pilti. Nupu seadistustes on suurele ja väikesele nupule määratud sama pildi ID. AutoCAD valib ikooni sõltuvalt väljundpildi suurusest. See tehnika võimaldab teil arvu oluliselt vähendada ICO failid C++ projekti ressurssides.

Ico-failide kasutamise küsimusest. Siin on kõik lihtne - lugege artiklit Ressursi dll kasutamine CUIxi jaoks läbipaistvate rastritega. Ausalt öeldes pole ma veel millegi sellisega mänginud, aga ma usun Dimat.
===
Lisatud:
Tsitaat artiklist ico-failide ühendamise kohta:

Lihtsalt lisage Visual Studio redaktori abil uus ico-ressurss ja redigeerige "RCDATA" ressursi atribuute "ICO", nagu allpool näidatud:

Lisaks ressursside salvestamisele EXE-failis saab Delphi arendaja luua ka dünaamilise teegi, mis sisaldab ainult ressursse. Vaatame, kuidas seda teha.

Ressursid võivad olla standardsed või kasutaja määratud. Standardressursi andmed kirjeldavad ikooni, kursorit, menüüd, dialoogi, bitikaarti, laiendatud metafaili, fonti, kiirklahvide tabelit, stringe ja versiooni. Kasutaja määratletud ressurss võib sisaldada mis tahes andmeid, mida rakendus vajab (other.EXE, GIF, MP3 jne).

Dünaamilised raamatukogud sisaldavad üldine kood või ressursse, mida saab jagada mitme rakendusega.

DLL-i loomine ressurssidega

Teha DLL ainult ressurssidega, peate looma ja kompileerima tühja projekti DLL, mis sisaldab linke ressursifailile .RES, mis sisaldab teie ressursse.

Seejärel järgige neid samme.

  1. Loo R.C. fail, mis kirjeldab ressursse, mida soovite sisestada DLL. Nagu näites:( adpdllressursid- Nimi R.C. faili ASCII) - üks IKON ja üks GIF lisatud R.C. fail:
  2. adpdllresources.rc aboutlogo RCDATA aboutlogo.gif tehas ICON FACTORY.ICO
  3. Koostada R.C. faili sisse RES faili, kasutades ressursikompilaatorit BRCC32
  4. Looge tühi projekt DLL. Salvestage see nimega adpResources.dpr- pärast koostamist DLL saab nime adpResources.dll. Täielik kood projekt DLLühes failis on ainult neli rida.
  5. raamatukogu adpRessursid; ($R adpdllresources.RES) algus lõpp.
  6. Koostage oma DLL(veendu selles adpdllresources.res on projektiga samas kataloogis DLL

Niipea kui DLL ressurssidega luuakse, saate seda oma sees kasutada Delphi rakendused. Pange tähele, et need ressursid on sees DLL saab kasutada mis tahes rakendust (mitte tingimata Delphi).

Kuidas kasutada DLL-ide ressursse

Et kasutada ressursse alates dünaamiline raamatukogu, laadige lihtsalt alla DLL ja ressursse, mida soovite kasutada.

Järgige neid samme.

  1. Looge uus Delphi projekt. Vaikimisi lisab Delphi projekti ühe vormi. Salvestage projekt
  2. Kopeeri DLL ressurssidega ( adpResources.dll kausta, kuhu teie uus rakendus salvestati
  3. Laadige ressurss alla järgmiselt...

Näide ikooni üleslaadimisest tehas ja maalige see lõuendile Vorm 1, Millal Nupp1: Tnupp vajutati).

Protseduur Tvorm1.Button1Click(Saatja: TObject); const resICON = "tehas"; var h:THandle;

Ikoon: HIcon; begin h:= LoadLibrary("adpResources.DLL"); GIF proovi kui h 0 siis alusta Icon:= LoadIcon(h, resICON); GIF DrawIcon (lõuend.käepide, 10, 10, ikoon); DLL end else begin ShowMessage("Ressursi DLL-i laadimine nurjus!");

lõpp;

lõpuks FreeLibrary(h);


AutoCAD on pikka aega kasutanud osaliste menüüfailidena CUIX-vormingut, mis on tavaline arhiiv, mille laiendus on ümber nimetatud ZIP-ist CUIX-iks. Meie ettevõttes on aga kasutusel AutoCAD 2009 SP3, mis CUIX-iga ei tööta, kuid kasutab vanemat vormingut – CUI-faile, mille sisu on esitatud XML-vormingus.

AutoCADi ja MS Visual Studio versioonide kohta (väike kõrvalekalle üldisest teemast)

Selleks, et kirjutada kontrollitud AutoCADi pistikprogrammi, saate kasutada mis tahes MS Visual Studio versiooni, millel on võimalus kompileerida hallatud koodi .NET-platvormi versiooni jaoks (2.0, 3.0, 3.5, 4.0, 4.5), mida kasutatakse AutoCADi versioonis huvitab meid. NET Frameworki sihtversioon on loetletud jaotises konfiguratsioonifail acad.exe.config ja soovi korral saame selle ümber määrata.

Kirjutamiseks kontrollimatu ARX-pluginad AutoCAD 2009 jaoks, saate kasutada ka mis tahes MS Visual Studio versiooni, kuid ainult tingimusel, et arvutil on see ehitustööriistade versioon, mis on teie AutoCADi versiooni jaoks vajalik ja need tööriistad on teie IDE-s kasutamiseks saadaval. Näiteks AutoCAD 2009 jaoks ARX-plugina kirjutamiseks vajate MS Visual Studio 2005 tööriistade versiooni. Tegelikult saate kasutada määratud IDE uuemaid versioone, kui projekti sätted on määratud nõutav versioon tööriistad, mida tuleks projekti ehitamisel kasutada:


Et atribuutide ripploend saaks Platvormi tööriistakomplekt seal oli elementide komplekt, mis võimaldas teil valida vajalik versioon tööriistad, tuleb need tööriistad eelnevalt installida. Need. Kõik MS Visual Studio versioonid, mille tööriistu soovite ehitamiseks kasutada, peavad olema arvutisse installitud. Sel juhul selgub, et töötate tegelikult uuemas IDE-s, kasutades selle eeliseid ja mugavusi ning kulisside taga koostatakse kood selle versiooni tööriistadega, mille oma projekti seadetes määrate.

MS Visual Studio versioonid tuleks installida järjestikuses järjekorras, alustades rohkemast vana versioon ja lõpetades uuemaga et vältida erinevaid konflikte. Pärast IDE järgmise versiooni installimist ärge unustage installida selle värskenduspakette.

Vaikimisi näeb ja kuvab MS Visual Studio 2012 platvormi tööriistakomplekti ripploendis ainult VS 2012, 2010 ja 2008 tööriistu. IDE vanemate versioonide loendis kuvamiseks peate käivitama ükskõik milline (need. üks neist) järgmistest toimingutest:

  • Installige Owen Wengardi loal MSI pakett.
  • Tehke käsitsi seadistamine, nagu näidatud.
Kui aga tegemist on DLL-i loomine ressursifaili, siis on kõik palju lihtsam: lihtsalt kompileerige fail üks kord (kasutades tööriistade mis tahes versiooni) Release Win32 konfiguratsiooniga ja seejärel kasutage seda x86\x64 platvormidel (kompileerisin x86 DLL-i ja samal ajal Windows 7 x64 minu CUI-fail ekstraktis sellest edukalt pildid).
Ressursi DLL-faili loomine

Looge rakenduses MS Visual Studio 2012 uus projekt tühja projekti malli alusel ja määrake sellele soovitud nimi:


Esiteks installime kohe konfiguratsiooni versioonis Win32:

Nüüd aknas Lahenduste uurija paremklõpsake projekti nimel ja valige ilmuvast kontekstimenüüst üksus Omadused. Omadustele vajalike väärtuste määramine Sihtlaiend Ja Konfiguratsiooni tüüp:



Kuigi DLL-fail on loodud programmis AutoCAD 2009 kasutatava CUI jaoks, on atribuudis Platvormi tööriistakomplekt versioon täpsustatud v110, mis vastab Visual Studio 2012-le, mitte v80(Visual Studio 2005 tööriistad), mida oleks vaja selle AutoCADi versiooni ARX-i pluginate kompileerimiseks.


Lisaks peate projekti seadetes muutma veel ühte valikut - Sisenemispunkt puudub:


Pärast ülaltoodud muudatuste tegemist vajutage nuppu Rakenda Ja OK. Nüüd on meie veel tühja projekti atribuudid õigesti konfigureeritud. Vahekaardil Lahenduste uurija, valige projekti kontekstimenüüst üksus Lisa -> Uus element... ja valige kuvatavas dialoogiboksis ressursifaili mall:



Saate failile määrata mis tahes nime, meie näites jätame selle resource.rc. Vajutage nuppu Lisa. Lisatud fail sisaldab piltide loendit, mida meie CUI-failides kasutatakse.

Nüüd loome oma projektikataloogis käsitsi alamkataloogi, kuhu kopeerime kõik pildifailid, mida tahame DLL-faili lisada. Alamkataloogi nimi võib olla suvaline, nimetagem seda pilte. Vahekaardil Lahenduste uurija valige projekti kontekstimenüüst üksus Avage File Exploreris kaust:



Looge avanevas Exploreri aknas alamkataloog pilte ja kopeerige sinna kõik vajalikud BMP-failid.

Eksperimendi korras lisame erineva suurusega BMP-faile: 16x16, 24x24, 32x32, 48x48, 64x64 ja 128x128. Tööriistapalettidel olevad nupud peavad sisaldama 16x16 kujutisi, samas kui lindipalettidele asetatud nupud on suuremad. Meie test-CUI-failis paneme ülaltoodud eraldusvõimega nuppe nii siia kui sinna, et näha erinevate suuruste kasutamise tulemust.

PNG-vormingus faile oleks võimalik kopeerida, kuid AutoCAD 2009 ei saa CUI-failides selles vormingus pilte kasutada. Nüüd pöördume tagasi meie IDE juurde: lk lülituda vahekaardileRessursivaade.



Elemendi kontekstimenüüst resource.rc helistage kaubale Lisa ressurss...


Dialoogiboksis Lisa ressurss nimekirjas Ressursi tüüp valige element Bitmap, vajutage nuppu Import... ja määrake BMP-failid meie varem loodud alamkataloogist pilte. Saame järgmise tulemuse:


Nüüd kõigile elemendi omaduse väärtus ID tuleb eraldada jutumärkidega, et neid saaks edukalt kasutada meie CUI-failides:


See on kõik, nüüd kompileerime oma DLL-faili:


Vaatame koostamise tulemuste aruannet:


Ja siin on meie kauaoodatud DLL:

Kopeerime saadud DLL-faili samasse kataloogi, kus meie CUI-fail on salvestatud, ja anname neile samad nimed: test.cui Ja test.dll. Nüüd saate CUI-failis kasutada meie DLL-faili BMP-ikoonide allikana, määrates meie CUI-failile käske (vt atribuute Väike pilt Ja Suur pilt) seejärel vara väärtus ID, mis oli varem eraldatud jutumärkidega:


Atribuudis määratud ikoonid Väike pilt kasutatakse palettidel Tööriistariba ja need, mis on näidustatud Suur pilt – sisse kasutatud Lint.

Pange tähele, et meie paneelil Mingi tööriistariba kõik kuvatakse BMP pildid välja arvatud viimane – see, mille mõõdud olid 128x128.

dll-faili loomine

Väga sageli kohtate oma töös sellist olukorda.

Teil on ees ülesanne, peate kirjutama programmi " Super märkmik" mis peaks säilitama kõik funktsioonid standardne märkmik, kuid neil on samal ajal mitmeid lisafunktsioone, tänu millele eelistab kasutaja tekstiga töötamiseks programmi valimisel teie programmi. Selleks otsustati lisada mitu uut funktsiooni, millest üks hakkab vastutama tekstis olevate sõnade loendamise ja kuvamise eest.

Paar nädalat hiljem kirjutati programm, siis jõudis see Internetti, kasutajad hindasid seda uus toode ja hakkas seda kasutama. Eesmärk on täidetud.

Aeg möödub ja teile antakse uus ülesanne kirjutada programm " Super parser"Selle programmi üheks funktsiooniks saab olema tekstis sõnade kokkulugemine. Saate aru, et peate jälle välja töötama meetodi, mis loeb sõnu. Kuid samal ajal mäletate, et nad töötasid hiljuti välja programmi milles seda funktsiooni. Et mitte jalgratast uuesti leiutada, avate programmi lähtekoodi " Super märkmik"; ja kopeerige kogu meetod uue programmi lähtekoodi" Super parser". Suurepärane, nüüd ei pea te selle meetodi uuesti kirjutamiseks aega raiskama ja saate rohkem aega pühendada ülejäänud programmielementidele. Probleem lahendatud.

Aga mis siis, kui sõnade loendusmeetodit pole kirjutanud sina, vaid näiteks mõni töökaaslane ja sa ei pääse mingil põhjusel juurde lähtekoodi programmid" Super märkmik See tähendab, et esimene võimalus, meetodi allikast kopeerimine, ei tööta ja seda meetodit Ma pean selle ise kirjutama, mmm, kurbus.

Siis aga helistab sulle töökaaslane ja ütleb: Tead, mulle meenus, kui ma seda meetodit välja töötasin, mõtlesin, et äkki pean seda kuskil mujal kasutama ja sel põhjusel otsustasin panna selle eraldi komplekti, dünaamilise teegi (dll) faili kujul. Lihtsalt kopeerige see fail dll oma projekti ja ühendage see välise koostuna, misjärel saate juurdepääsu minu meetodile ja saate seda kasutada.

Suurepärane! Teete kõik programmis kirjeldatud toimingud " Super parser” kuvatakse soovitud meetod, on probleem lahendatud ja te ei pea jällegi koodi käsitsi uuesti kirjutama.

See lõpetab ütluse ja nüüd liigume üksikasjalikuma uuringu juurde.

Mis on DLL

DLL(dünaamilise lingi teek) on dünaamiline lingiteek või lühidalt dünaamiline teek.

Nagu ma varem kirjutasin, võimaldavad dünaamilised teegid varem kirjutatud koodi uuesti kasutada ja need pakuvad ka paremat koodi teisaldatavust. Piisab faili teisaldamisest mälupulgale või laadige alla dll faili Internetist, seejärel lisage see praegusesse projekti ja saate kohe oma rakenduse jaoks erinevate lisafunktsioonide komplekti. Tasub teada ka seda ühes dll faili salvestada saab suvalise arvu tüüpe, liikmeid ja nimeruume.

dll-faili loomine

Kõigepealt valime uue tüübi loodav rakendus või pigem projekti.

Vali klassi raamatukogu, see tähendab, et loome dünaamilise teegi (dll) faili

Samuti saate määrata, millise raamistiku versiooni jaoks see projekt luuakse.

Kui Visual Studio on projekti skeleti loonud, näete järgmist.

Selline näeb välja Solution Exploreri aken

Ja selline see välja näeb tööpiirkond, kuhu tavaliselt kirjutate programmi koodi

Ja nii antakse nimeruum: Auto ja klass: Class1. Class1 ei ole hea nimi, muudame veidi oma koodi, asendame Class1 BMW-ga ja lisame meetodi, mis prindib meie klassi nime.

Ja nii on kood kirjutatud ja nüüd on vaja komplekti saamiseks kompileerida.
Kui proovite nüüd vajutada F5 või Ctrl+F5, näete seda akent


See viga näitab ainult seda, et loodi dünaamiline teegi fail ( dll), mitte käivitatava faili (exe) asemel, mida ei saa käivitada.

Projekti koostamiseks vajutage klahvi F6, misjärel ilmub kataloogi bin\Debug fail Car.dll.

Et kontrollida, kas teegi fail on loodud, kasutage nuppu Kuva kõik failid vahekaardil Solution Explorer

Dünaamilise teegifaili kujul olev koost on edukalt loodud.

Nüüd läheme kausta bin\Debug, et kiiresti praeguse projekti kataloogi liikuda, kasutage samas Solution Exploreris üksust Avage Windows Exploreris kaust

Kopeerige saadud koostefail (meie puhul fail Car.dll) mõnda ajutisse kausta. Tegelikult pole seda vaja teha, võite lahkuda see fail selles kaustas, kuid mugavuse huvides loome uus kaust ja asetage sinna loodud teegifail.

Seejärel sulgeme praeguse projekti ja loome uue. Kuid seekord valime projekti tüübi - konsoolirakendus.

Loome uue projekti.

Uus projekt on loodud. Nüüd ühendame oma raamatukogu (Car.dll) praeguse projektiga

dll ühendamine

Selleks kaustas Viited, tuleb Solution Exploreri aknas paremklõpsata ja valida Lisa viide, avaneb järgmine aken:

  1. Valige vahekaart Sirvi
  2. Määrake kaust, milles loodud teegifail asub (meie näites - Car.dll)
  3. Valige fail vajalik raamatukogu ja vajutage nuppu OK;
Kui kõik on õigesti tehtud, näete järgmist pilti

See näitab, et meie praegusesse projekti lisati edukalt link meie Car.dll koostule, mis salvestab meie IL-koodi. Loodan, et mäletate, et pärast kompileerimist muudetakse kogu teie kirjutatud kood IL-is vahekoodiks (CIL, MSIL - see on sama asi). Samuti näete, et meie teegi koopia paigutati kausta bin\Debug.

Kui unustate äkki, mis nimeruumi, tüüpe või liikmeid teie loodud teegis on. Saate alati kasutada Visual Studio tööriista nagu Objektibrauser. Selleks minge vahekaardile Solution Explorer, avage kaust Viited ja lihtsalt paremklõpsake varem lisatud teegil, meie puhul tuletan teile meelde - see on fail (Car.dll) ja valige Vaadake objektibrauseris, ilmub selline aken.

Objektibrauseri aknas saate vaadata meie koostu sisu.

Koost on ühendatud ja nüüd saate selle sisuga töötada. Järgmisena lõpetame valikulise sammu.

Lisame kasutamise märksõna kasutades meie loodud Car.dll teegist Car nimeruumi, misjärel loome BMW klassi objekti ja käivitame meetodi Output_Class_Name().

Tulemus:

Kõik töötab.

Ja nii jälle järjekorras:

  1. Looge dünaamilise teegi (dll) fail
  2. Ühendamine cos see raamatukogu meie projektile, lisades meie dll-faili lingi kausta Viited.
  3. (Valikuline) Ühendame ühendatud koostu nimeruumi kasutades võtmesõna või kasutame täisnime, st Namespace.Type (Car.BMW).
  4. Kasum
Need neli sammu aitavad teid luua dll raamatukogu ja ühendage see oma projektiga.

Ja lõpus pole montaažitüüpide kohta palju teavet:

Assamblee on järgmist tüüpi: üldised ja eraviisilised.

Eramonteerimine

Need on teegifailid, nagu meie varem loodud Car.dll-fail, mis sisalduvad kataloogis kogu aja jooksul praegune rakendus või mõni selle alamkataloog.

Läheme tagasi artikli algusesse.

Pärast rakenduse "Super Parser" loomist saime koostu faili (exe) kujul. Siis otsustasime oma programmi testida ja sõbrale kinkida ning mainige seda ka, kui ta seda soovib lisafunktsioonid programmis, siis vajab ta lihtsalt enda kõrvale exe faili asetage teegi fail Car.dll. Pärast seda saab ta tekstis sõnu kokku lugeda. See tähendab, et teek salvestatakse käivitatava failiga samasse kataloogi.

Ühine kokkupanek

Need on mitmekordseks kasutamiseks mõeldud sõlmed erinevaid rakendusi installitud ühte arvutisse.

Näiteks on meil kaks programmi. Millist meie Car.dll-faili kasutab, et seda faili igasse kausta mitte kopeerida, saame selle paigutada spetsiaalsesse kohta nimega Global Assembly Cache – (GAC) või globaalse koostu vahemälu. Nüüd salvestatakse koost ühte spetsiaalsesse kohta ja teie programmid teavad alati, kust seda kooditeeki leida. Kui kasutaksime privaatmeetodit, peaksime oma teegi paigutama igasse rakenduse kausta, millega see peaks suhtlema.

Ainult ressursse sisaldava DLL-i loomine

Ressursifail tuleb kompileerida - "rc MyResDll.rc" - ja linker teisendada DLL-iks, määrates kindlasti lipu "/NOENTRY", kuna see dünaamiline teek sisaldab ainult ühte ressurssi, mitte koodirida: " link MyRedDll.res /DLL / NOENTRY".

Visual Studios on seda veelgi lihtsam teha - klõpsake lihtsalt "aknas" kausta "Ressursid" Failivaade"ja lisage uus fail ressurssi, mida saab seejärel muuta visuaalne redaktor oma äranägemise järgi.

Ressursi laadimiseks DLL-ist saab põhimõtteliselt kasutada meile juba tuttavat funktsiooni LoadLibray ja edastada tagastatud LoadString deskriptor või mõni muu ressurssidega töötav funktsioon. Dünaamilise teegi laadimist saab aga oluliselt kiirendada, kui "selgitame" süsteemile, et see DLL ei sisalda midagi peale ressursside ja me peame selle lihtsalt protsessi aadressiruumi projitseerima ja kõige muu eest saame ise hoolitseda. .

Siin tuleb appi funktsioon LoadLibraryEx: selle esimene argument, nagu ka kolleeg LoadLibrary, määrab laaditava dünaamilise teegi nime, teine ​​on reserveeritud ja peab olema võrdne nulliga, ja kolmas, mis on võrdne LOAD_LIBRARY_AS_DATAFILE, sunnib funktsiooni tegema täpselt seda, mida me vajame - laadima DLL-i andmebaasina (kui dünaamiline teek sisaldab lisaks ressurssidele ka koodi, siis selle võtmega laadimine siiski õnnestub, kuid laaditud DLL-i funktsioonid pole saadaval - ainult ressursid):

#kaasa

#kaasa

h=LoadLibraryEx("MyResDll.dll",0,

LOAD_LIBRARY_AS_DATAFILE);

LoadString(h,1,&buf,99);

printf("%s\n",&buf);

Optimeeritud DLL-i laadimise demonstreerimine, mis sisaldab ainult ressursse

See programm kompileerib täpselt samamoodi nagu eelmised eksplitsiitse linkimise näited – ja käivitamisel kuvab see võidukalt "Tere, Word!", mis kinnitab, et dünaamilise lingi teegi "string" ressurss laaditi edukalt! Sarnasel viisil saate ressursse alla laadida aadressilt käivitatavad failid; Sellest vaatenurgast ei erine need dünaamiliste teekide omadest.

OOP ja DLL

#include "stdafx.h"

DWORD ul_reason_for_call,

LPVOID lpReserveeritud

//Meie kood.

//Lisa funktsioon Lisa.

kui(a>b) res = a; muidu res = b;

Meister tegi meile meie dll-i malli. Me arendame seda. Selleks tuleb lisada 1 funktsioon ja üks klass koos meetodiga. Siin on kood:

#include "stdafx.h"

BOOL APIENTRY DllMain(HANDLE hModule,

DWORD ul_reason_for_call,

LPVOID lpReserveeritud

//Meie kood.

//Lisa funktsioon Lisa.

Declspec(dllexport) int Add(int a, int b)

//Lisage MyMax meetodiga klass MyClass.

Declspec(dllexport) int MyMax(int ​​​​a, int b)(

kui(a>b) res = a; muidu res = b;

Pange tähele, et funktsioonide ja meetodite lisamisel, mida tahame väliselt kutsuda, kirjutage need modifikaatoriga __declspec(dllexport). Nii märgime ära nn eksporditud funktsioonid.

Paneme programmi kokku. Fail firstdll.dll peaks ilmuma projekti silumiskaustas.

Nüüd kirjutame testprogrammi.

#kaasa

//Kaasake nõutav päisefail.

#include "..\firstdll.cpp"

cout<

cout<

Käivitame programmi. Nagu arvata võis, trükitakse see 22. ja 11.

DllMain funktsioon

Enamik DLL-e on lihtsalt sisuliselt sõltumatute funktsioonide kogumid, mis eksporditakse rakendustesse ja mida need kasutavad. Lisaks ekspordiks mõeldud funktsioonidele on igal DLL-il funktsioon DllMain. See funktsioon on mõeldud DLL-i lähtestamiseks ja puhastamiseks. See asendab Windowsi eelmistes versioonides leiduvad LibMaini ja WEP-funktsioonid. Lihtsaima funktsiooni DllMain struktuur võib välja näha järgmine:

BOOL WINAPI DllMain (HANDLE hInst, DWORD dwReason, LPVOID IpReserved) (

BOOL bAllWentWell=TRUE;

lüliti (dwReason) (

case DLL_PROCESS_ATTACH: // Protsessi lähtestamine.

case DLL_THREAD_ATTACH: // Käivitage lõime.

case DLL_THREAD_DETACH: // Tühjenda lõime struktuurid.

case DLL_PROCESS_DETACH: // Protsessistruktuuride puhastamine.

if(bAllWentWell) return TRUE;

else return FALSE;

Funktsiooni DllMain kutsutakse välja mitmel juhul. Selle kutsumise põhjuse määrab parameeter dwReason, mis võib võtta ühe järgmistest väärtustest.

Kui protsess laadib esimest korda DLL-i, kutsutakse funktsioon DllMain välja dwReasoniga, mis on võrdne väärtusega DLL_PROCESS_ATTACH. Iga kord, kui protsess loob uue lõime, kutsutakse DllMain välja dwReasoniga, mis on võrdne väärtusega DLL_THREAD_ATTACH (välja arvatud esimene lõime, sest sel juhul on dwReason võrdne DLL_PROCESS_ATTACH).

Kui protsess DLL-iga töötamise lõpetab, kutsutakse funktsioon DllMain parameetriga dwReason, mis on võrdne väärtusega DLL_PROCESS_DETACH. Kui lõime hävitatakse (välja arvatud esimene), võrdub dwReason väärtusega DLL_THREAD_DETACH.

Kõik protsesside ja lõimede lähtestamis- ja puhastustoimingud, mida DLL vajab, tuleb läbi viia dwReasoni väärtuse põhjal, nagu on näidatud eelmises näites. Protsessi lähtestamine piirdub tavaliselt lõimede vahel jagatud ressursside eraldamisega, nagu jagatud failide laadimine ja teekide lähtestamine. Lõime lähtestamist kasutatakse ainult antud lõimele omaste režiimide konfigureerimiseks, näiteks kohaliku mälu lähtestamiseks.

DLL võib sisaldada ressursse, mis ei kuulu seda kutsuvale rakendusele. Kui DLL-i funktsioonid töötavad DLL-i ressurssidel, oleks ilmselt kasulik salvestada hInst-käepide kuskile eemale ja kasutada seda DLL-ist ressursside laadimisel. IpReservedi osuti on reserveeritud Windowsi sisekasutuseks. Seetõttu ei tohiks taotlus seda nõuda. Saate kontrollida ainult selle väärtust. Kui DLL laaditi dünaamiliselt, on see NULL. Staatilisel laadimisel ei ole see osuti nullist erinev.

Kui see õnnestub, peab funktsioon DllMain tagastama väärtuse TRUE. Vea ilmnemisel tagastatakse FALSE ja edasine tegevus lõpetatakse.

kommenteerida. Kui te oma funktsiooni DllMain() ei kirjuta, kasutab kompilaator standardversiooni, mis tagastab lihtsalt TRUE.

Probleemi näide:

HANDLE hTread; DWORD dwThreadId;

lüliti (fdwReason)

juhtum DLL_PROCESS_ATTACH:

// DLL on vastendatud protsessi aadressiruumiga

// loo lõime töö tegemiseks

hThread = CreateThread(NULL, 0, SomeFunction, NULL, 0, &dwThreadId);

// lükka meie lõime edasi, kuni uus lõim on valmis

WaitForSingleObject(hThread, INFINITE);

// juurdepääsu uuele lõimele pole enam vaja

CloseHandle(hThread);

juhtum DLL_THREAD_ATTACH:

// luuakse teine ​​lõim

juhtum DLL_THREAD_DETACH:

// lõim lõpeb õigesti

juhtum DLL_PROCESS_DETACH:

// DLL laaditakse protsessi aadressiruumist maha

Sisendpunkti funktsioonid peaksid täitma ainult lihtsaid lähtestamistoiminguid. Nad ei tohiks kutsuda funktsiooni LoadLibrary või LoadLibraryEx (või neid funktsioone kutsuvat funktsiooni), kuna see võib luua DLL-i laadimisjärjestuses sõltuvussilmusi. See võib tuleneda sellest, et DLL-i kasutatakse enne, kui süsteem on käivitanud lähtekoodi. Samuti ei tohiks sisenemispunkti funktsioon kutsuda funktsiooni FreeLibrary (või seda kutsuvat funktsiooni), kuna see võib põhjustada DLL-i kasutuselevõtu pärast seda, kui süsteem on oma väljumiskoodi täitnud.

Näide Microsoftilt. Samm-sammult juhend. DLL (C++) Visual Studio 2013 loomine ja kasutamine

See ülevaade kirjeldab, kuidas luua C++ rakendusega kasutamiseks dünaamiline lingiteek (DLL). Teegi kasutamine on hea viis koodi taaskasutamiseks. Selle asemel, et samu protseduure igas programmis uuesti rakendada, loote need üks kord ja viitate neile seejärel teistest rakendustest. Asetades koodi DLL-i, säästate ruumi igas koodile viitavas rakenduses ning saate ka DLL-i värskendada ilma kõiki rakendusi uuesti kompileerimata. Lisateavet DLL-ide kohta leiate jaotisest Visual C++ DLL-id.