Dll și reutilizarea codului se divid și se simplifică

DLL și reutilizarea codului: Împărțiți și simplificați

Jeffrey Slarve

Cu mulți ani în urmă, când eram relativ nou-venit pentru Clarion pentru Windows (cred că era versiunea 1.0), îmi amintesc că am citit eseul lui Dave Harms despre împărțirea aplicației în mai multe DLL-uri. Acesta a fost un mare salt pentru mine în a înțelege de ce împărțirea unei aplicații este un lucru bun, cât de simplu este pur și simplu făcut și cum accelerează procesul de dezvoltare. Folosirea DLL-ului îmi permite să lucrez cu mici părți ale proiectului fără a trebui să recompilam întreaga aplicație după orice schimbare / test pe care trebuie să-l fac. Totul în lume a fost fericit și am trăit fericit după aceea. Sfârșitul.

Ei bine, nu chiar sfârșitul. După un timp, am scris proiectul din spatele proiectului (proiectul înseamnă în acest caz toate componentele aplicației) și am observat că trebuie să repet același cod în fiecare proiect. Cele mai multe dintre aceste funcții au fost destul de versatile și nu au legătură cu dicționarul. Așa că am încercat să fac un DLL generic. care nu are nevoie de un Dicționar și de alte date globale, dar Generatorul de aplicații a simțit că este mai deștept decât mine (ceea ce, de fapt, ar putea fi bine). AppGen generează un pachet de variabile globale (GlobalRequest, GlobalResponse, etc.) fie externe, fie locale. Dacă datele globale sunt locale, înseamnă că spațiul pentru ele este alocat DLL-ului. șabloanele generează un fișier .EXP și includ aceste variabile globale în el, ceea ce conduce la o eroare dublă a numelui la construirea proiectului. Dacă încerc să fac aceste date externe globale. atunci toate variabilele mele globale pe care le folosesc în acest DLL sunt disponibile în orice proiect care folosește acest DLL partajat.

Mai intai am incercat sa il pacalez pe AppGen. folosind variabilele locale și modificând fișierul EXP după generarea codului, dar a fost prea dificil. Mai ales când ABC a apărut cu declarațiile sale de clasă mondială.

Dar ce sa întâmplat? Ce voi face acum? O altă opțiune este de a crea DLL "manual". Acest lucru pare prea complicat, dar îmi amintesc că acest cod se schimba foarte rar, astfel încât efectul este că trebuie doar să faceți acest lucru odată și, în același timp, să învățați cum să faceți acest lucru. În plus, voi obține multe beneficii atunci când am pus funcțiile generice utilizate în mod curent într-un DLL separat:

1. Reutilizarea codului. Nu mai trebuie să rescrieți sau să importați funcția DayOfWeek (). sau funcția de a obține un widget de la un dofladgey. Trebuie doar să conectați această DLL la aplicație și este gata.

2. Scrieți o singură dată. și fixați într-un singur loc. Dacă trebuie să faceți o schimbare a funcției generale, aceasta se poate face numai într-un singur loc. Adesea, o aplicație care utilizează un astfel de DLL nu trebuie nici măcar să fie recompilată. Recompilați numai în următoarele situații:

a) Unul dintre prototipuri sa schimbat. Dacă prototipul oricărei funcții DLL sa schimbat. atunci aplicația nu va putea găsi această procedură dacă nu este recompilată.
  • b) au fost adăugate proceduri noi. De obicei, nu este nevoie să recompilați aplicația dacă au fost adăugate funcții noi în DLL. Desigur, dacă trebuie să utilizați aceste noi funcții în aplicație, va trebui să o recompilați.
  • c) Noua versiune a Clarion. În mod normal nu puteți utiliza un DLL. care este compilat pe o versiune diferită a Clarion. Desigur, puteți face acest lucru, dar cu ajutorul unor cunoștințe sau instrumente speciale. Este mai bine să recompilați.







  • 3) ușurința de sprijin. Când DLL se face o singură dată, este foarte ușor să faceți modificări. Acest lucru este mult mai ușor decât încercarea de a face schimbări în aceeași funcție DayOfWeek () în 20 de locuri.

    4) Răceală. DLL-ul este foarte cool. De fapt - foarte cool.


    Crearea manuală a unui DLL

    Există mai multe lucruri pe care trebuie să le faceți pentru a crea manual un DLL. Este posibil ca unele dintre ele să nu pară familiare celor care nu au întâlnit încă acest aspect al programării, dar, de fapt, ele nu sunt complexe atunci când vă dați seama. Iată pașii:

    1. Creați un director
    2. Creați un fișier PRJ
    3. Creați un fișier (e) sursă
    4. Creați un fișier EXP
    5. Compilați DLL-ul
    6. Faceți prototipurile DLL disponibile
    7. Faceți DLL accesibil tuturor aplicațiilor
    8. Utilizați DLL-ul

    Primul pas este crearea unui director undeva în arborele directorului de proiecte Clarion. Este o idee bună să țineți toate componentele într-un singur loc.

    Creați fișierul PRJ

    PRJ - fișier sau proiect - acesta este tata (sau, dacă doriți, mumie) bass DLL. Trebuie să cunoașteți tot ceea ce conține DLL-ul dvs. inclusiv drivere de fișiere, biblioteci externe, icoane. și codul sursă. Fără un proiect, nu știu ce să fac. Poate să pescuiască sau să cânte la chitară.







    Este foarte ușor să creați un fișier PRJ în Clarion IDE:

    a) Faceți clic pe Fișier | Nou și selectați Proiect
    b) În dialogul de fișiere care urmează, trebuie să introduceți numele noului proiect. Acesta poate sau nu poate fi același ca DLL. Dați clic pe Salvați.
    c) Acum ar trebui să vedeți o fereastră numită Fișier nou de proiect. În această fereastră puteți:
    i. Introduceți numele proiectului. Acest câmp este opțional.
    ii. Fișierul principal este numele fișierului principal CLW al proiectului dvs. Trebuie doar să introduceți un nume aici și să faceți clic pe fila Tab. Nu trebuie să fie numele unui fișier existent.
    iii. Fișierul țintă se va potrivi, probabil, cu numele fișierului principal. Extensie EXE. Se va schimba în DLL. După ce modificați tipul de destinație la un DLL. Faceți clic pe OK.
    d) Tocmai ați creat un proiect. Dacă acesta este primul dvs. proiect, atunci felicitări.

    S-ar putea să fi observat că există un alt tip de țintă numit Bibliotecă. Bibliotecile sunt foarte asemănătoare DLL-urilor. dar au avantaje și dezavantaje în comparație cu DLL-ul. Prefer să folosesc DLL-uri pentru că sunt mai ușor de gestionat și sunt mult mai puțin probabil să necesite o recompilare completă a întregii aplicații. Dacă faceți orice schimbare la LIB. atunci va trebui să recompilați (cel puțin re-legați) toate aplicațiile care utilizează acest LIB. Singurul dezavantaj al DLL-ului este faptul că se adaugă încă un fișier pachetului de aplicații. Cu toate acestea, acest lucru este de obicei un avantaj, deoarece atunci când modificați DLL-ul, trebuie doar să trimiteți un singur fișier.

    Creați un fișier (e) sursă

    Acesta este locul în care vor fi localizate funcțiile / procedurile dvs. În sensul prezentului articol, folosesc una dintre funcțiile site-ului meu ClarionFAQ.com. Această funcție este utilizată pentru a vă deplasa în fereastra Control parental (grup, opțiune etc.) împreună cu comenzile "copil". Dacă ați încercat vreodată să mutați un astfel de control în timpul rulării. atunci știi că controlul copilului nu are nicio idee despre locul în care părintele se mișcă.

    Următoarele reprezintă minimul de ceea ce trebuie să puneți în modulul principal și un cod DLL similar pentru a se compila.

    a) instrucțiunea PROGRAM sau MEMBER. Deși DLL-ul nu este un program, compilatorul are nevoie de el oricum. Dacă utilizați instrucțiunea MEMBER. apoi asigurați-vă că nu are parametri. Trebuie să fie pe prima linie undeva dincolo de prima coloană.
    b) Operatorul MAP. Aici puneți prototipurile funcțiilor pe care le utilizați și exportați în DLL.

    hartă
    JSMoveParentControl (Long pParentFEQ, Long pXShift, Long pYShift, Byte pMoveType = 0)
    capăt

    c) Secțiunea CODE. Aici scrieți codul. Vedeți fișierul atașat mydll.clw, deoarece va fi împreună.

    Creați un fișier EXP

    Fișierul EXP sau fișierul de export și definiție a modulelor este utilizat pentru a informa proiectul despre variabilele și funcțiile care trebuie exportate pentru alte aplicații care utilizează DLL-ul. Unele funcții pot fi utilizate numai în alte funcții ale DLL-ului dvs. și apoi nu trebuie să fie exportate. Fișierul EXP poate fi foarte complicat sau simplu, dar în orice caz este doar un fișier text. Ajutor pentru Clarion 6 conține o mulțime de informații despre fișierele EXP, dar este posibil să o găsiți. Căutați doar .EXP și apoi consultați Fișierele de definiție a modulelor.

    Acesta este modul în care arată fișierul EXP al DLL-ului nostru mic:

    NAME 'MYDLL' GUI
    EXPORTURI
    JSMOVEPARENTCONTROL @ FlllUc @?
    Asigurați-vă că adăugați un șir gol la sfârșit!

    Rețineți linia JSMOVEPARENTCONTROL @ FlllUc. Vedeți că nu arată ca prototipul original al funcției JSMoveParentControl (). Te întrebi de ce. Nu știu. Și nu cred că știe cineva. Pur și simplu funcționează. Aceasta se numește Name Mangling. Vă permite să supraîncărcați numele procedurilor. Numele Mangling poate fi dezactivat dacă utilizați procedura Name (), iar acest lucru poate funcționa bine în majoritatea cazurilor, dar nu este prea dificil să faceți Mangling pe cont propriu. Din fericire, un program de probă (% CWROOT% \ Examples \ Src \ Pro2exp) este livrat împreună cu Clarion. Doar compilați acest program, introduceți prototipul în câmpul de introducere și apăsați TAB. Pro2exp va arăta prototipul tău măcinat.

    NOTĂ: Observați propunerea pentru o linie goală după ultima linie a fișierului EXP. Acest lucru este foarte important și am petrecut ore întregi în scris acest articol. Înainte de a adăuga această linie, IDE (C5.5) "a scăzut" și nu a exportat funcția mea în timpul asamblării finale a DLL-ului.

    Bine. Faceți clic pe acest buton cu un fulger și lăsați-l să clipească. Din fericire, ca și cu mine, prima dată când ai compilat totul fără erori. Haha. Bine. În cele din urmă a fost compilată. Și asta. După compilarea cu succes a proiectului DLL. veți obține fișiere DLL și LIB. Fișierul LIB este "lipici" pentru conectarea DLL-ului la aplicație. Acesta este plasat într-un proiect de aplicație care va folosi DLL-ul. Când atașați un DLL la o aplicație în acest fel, trebuie să plasați DLL-ul într-un loc unde aplicația o poate găsi. (Vezi și trei articole de Larry Sand) despre încărcarea unui DLL în timpul rulării.

    Faceți prototipurile DLL disponibile

    De obicei, creez un fișier inclus pentru a fi inclus în aplicații, așa că în aplicație nu trebuie să introduc nimic pentru a face funcțiile disponibile. Trebuie doar să copiați secțiunea MAP într-un fișier separat. Chiar acum.


    Faceți DLL-ul accesibil tuturor aplicațiilor

    Acum ai un DLL și probabil că o vei folosi. Presupun că aveți o fantezie suplimentară și puteți scrie un șablon care conectează DLL-ul la aplicație. Dar este atât de ușor de făcut că nu contactez din cauza asta cu șabloanele. Iată tot ce trebuie să faceți:

    1. Deschideți aplicația. unde trebuie să adăugați un DLL
    2. Faceți clic pe fila Module.
    3. Faceți clic pe meniul Aplicație și apoi selectați Inserare modul. Se afișează fereastra Select Module Type.
    4. Selectați în această fereastră DLL extern
    5. În câmpul Nume, introduceți numele DLL-ului cu extensia LIB
    6. În câmpul File include map, introduceți numele fișierului dvs. include

    NOTĂ: Dacă utilizați fișierul include. procedurile DLL nu vor fi vizibile automat în AppGen. deși le puteți utiliza în embeduri. Este frustrant dacă nu știi despre asta. Dacă trebuie să faceți procedurile vizibile în AppGen. atunci acestea vor trebui introduse manual ca Extern (sau exportate dintr-un alt App) în loc să folosească fișierul inc. Selectați DLL-ul. Faceți clic pe Insert sau selectați Procedure | New și creați procedura cu prototipul corect. Este posibil să fie necesar să includeți atributul Declare global în descrierea procedurii.

    Carl Barns a scris un șablon utilitar care folosește funcția LinkName () din limbajul șablon Clarion. Fișierul CBMangle.zip conține un șablon și exemple de fișiere de intrare și de ieșire. Avantajul utilizării acestui șablon pentru a genera un fișier EXP este că funcția LinkName () are cea mai corectă logică pentru procesarea inovațiilor în limbă. Mulțumesc lui Carl.







    Trimiteți-le prietenilor: