03. januar 2001 - 21:21Der er
7 kommentarer og 2 løsninger
DLL i Borland C++ Builder
Jeg vil gerne lave et program, som benytter et beregningsmodul. Jeg forestiller mig, at det skal være en dll, som linkes dynamisk ved kørsel (altså ikke ved compileringen). I den forbindelse har jeg nogle spørgsmål (jeg har aldrig før lavet dll\'er og har endnu ikke fået noget til at virke).
1) Modulet beregner en stor mængde data i tabelform ud fra et par tal. Er det så hensigtsmæssigt at overføre disse tal som parametre til dll\'en og hvordan bør dataene returneres (se også punkt 3)?
2) Hvordan får jeg det til at virke (et lille eksempel)? Nedenstående ligger i min form og jeg forestiller mig så, at der ligger en funktion Dobbel(float) i dll\'en.
Jeg prøvede også med dynamisk linkning, men det kan jeg ikke få til at virke: ------------------------------------------------ void __fastcall TForm1::Button1Click(TObject *Sender) { void* func; LoadLibrary(\"MyDLL.dll\"); GetProcAddress(func, \"Dobbel(float x)\");
float x = StrToFloat( Edit1->Text ); x = func(x); Edit1->Text = FloatToStr(x); } ------------------------------------------------
Projektfilen project.cpp indeholder linien ------------------------------------------------ USEUNIT(\"MyDLL.cpp\"); ------------------------------------------------
Jeg har lavet en dll med følgende indhold ------------------------------------------------ #include <vcl.h> #pragma hdrstop int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*) { return 1; }
Hvad skal der til for at jeg kan benytte Dobbel(float)? Og hvorfor virker det ikke, hvis jeg fjerner \"int WINAPI....\" eller #include <vcl.h>?
3) (Ikke dll-spørgsmål) Når mit program opererer med store(?) datamængder, hvordan er det så smartest at overføre/opbevare disse data? Hele tiden gemme til og læse fra fil / Bruge BDE / arrays? Det drejer sig om op til flere tabeller på måske op til 10000 rækker gange 50 kolonner doubles.
Er jeg helt på gale veje????? Har I eventuelt et godt link om dll\'er, for der står ikke meget i min Builder-help?
Umiddelbart vil jeg mene at din ide er god nok - men ... en DLL giver kun mening hvis du skal anvende beregningsrutinen i mere end eet \"hoved\"-program, ellers vinder du ingenting ved at gøre som du beskriver: om du linker dynamisk i forbindelse med afviklingen af programmet, eller rutinen er en fast del af programmet gør ingen forskel.
Mht. parameteroverførsel, så kan du jo nøjes med at overføre fire parametre:
- Dine to \"seeds\" - Et tal med størrelsen af din tabel (evt. 2 tal, hvis den er to-dimensionel) - En pointer til tabellen i dit hovedprogram
Ideen med DLL\'er er jo netop at de virker transparent i forhold til resten af dit program, og herunder bl.a. at de ikke opbevarer data selv.
Sagen er, at beregningsrutinen er ret generel og derfor godt kunne tænkes at skulle bruges af andre programmer i fremtiden. Er det så ikke smartest at lave det som en dll? Hvis jeg linker statisk bliver dll\'en så ikke bare en del af mit program (af .exe-filen)?
Om du linker statisk eller dynamisk til DLL filer har ikke noget at sige i forhold til størelsen af din exe fil. Du få under allle omstendighedder 2 filer en DLL fil og en exe fil.
Der er, efter min mening, visse fordele ved at loade dynamisk: Du får mulighed for fejlhåndterin, hvis DLL\'en ikke findes. Samt du bruger ikke ram mens den ikke bruges.
Jeg vil gerne kunne afbryde beregningerne, da de kan tage ret lang tid. Kunne I ikke lave et lille eksempel med et program som linker en dll dynamisk og kalder en funktion i dll\'en - samt kan standses hvis brugeren ønsker det?
Med \'seeds\" mener jeg det to tal du nævner som danner grundlag for hele beregningen.
Det du er inde på her til sidst er noget helt andet - nemlig Threads. Threads er forenklet sagt en måde at køre små SAMTIDIGE programmer inde i et hovedprogram. Du kender princippet fra timer komponenter som du kan lægge på din form. Timer komponenten kører nemlig hele tiden, også selv om du er ved at behandle f.eks. et klik fra en knap.
Jeg har lavet en utility som konverterer en fil og samtidigt tillader brugeren at trykke på en knap for at afbryde. Princippet er simpelt: en global bool variabel som sættes til sand når brugeren trykker på knappen, og et loop i beregningsblokken, som checker mod denne variabel.
Princippet i Threads er lidt det samme - her laves blot en global routine som kan returnere værdien af den globale variabel, og denne rutine kaldes så blot af tråden vha. Synchronize metoden. Jeg har anvendt pricinppet til at \"konvertere\" mine gamle DOS programmet, som jo IKKE er event styrede, til windows, idet selve DOS køres som en tråd. Når DOS programmet skal levere output eller modtage input sætter det blot et globalt flag, og suspender sig selv. Herefter kan hovedprogrammet behandle input og/eller output og resume tråden når det er gjort. En af fiduserne ved at anvende tråde, er at man kan lade tråden checke på en \'Terminated\' property, som dit hovedprogram så blot kan sætte. hvis beregningen skal afbrydes.
Borland har lavet et TThreads eksempel der illustrerer hastighedsforskellen mellem tre forskellige måder at sortere på vha. tråde. Det er meget illustrativt og enkelt at gå til - også med henblik på at ændre det til dit behov.
Hvis du ikke selv kan komme videre, kan jeg godt prøve at lave et TThread ekspempel til dig, som illustrerer en løsning på dit problem, men det kommer lige til at tage lidt mere tid.
soepro >> Hvis du vil lave et lille eksempel, så vil det være helt kanon. Det behøver ikke at kunne noget særligt eller noget med en hel masse parametre frem og tilbage (det skal jeg nok selv finde ud af) - bare jeg kan se principperne i hvordan jeg får det til at virke. Et eksempel som linker dynamisk til en dll og kører den som en thread vil være virkelig lækkert.
Du må stadig gerne lave et lille demo-eksempel hvis du gider soepro. Men på automatisk opfordring fra eksperten.dk, så må jeg hellere se at dele pointene ud.
... selvom jeg egentlig aldrig rigtig fik noget svar på punkt 2 ...
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.