Avatar billede bjarke Nybegynder
03. januar 2001 - 21:21 Der 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.

------------------------------------------------
extern \"C\" __declspec(dllexport) float Dobbel(float);

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    float x = StrToFloat(Edit1->Text);
    Edit1->Text = FloatToStr(Dobbel(x));
}
------------------------------------------------


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;
}

extern \"C\" __declspec(dllexport) float Dobbel(float);

float Dobbel(float x)
{
    return 2*x;
}
------------------------------------------------

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?

-Bjarke
Avatar billede soepro Nybegynder
04. januar 2001 - 09:05 #1
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.
Avatar billede bjarke Nybegynder
04. januar 2001 - 09:29 #2
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)?

Hvad mener du med seeds?
Avatar billede borrisholt Novice
04. januar 2001 - 12:02 #3
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.

Jens B
Avatar billede bjarke Nybegynder
04. januar 2001 - 12:48 #4
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?
Avatar billede soepro Nybegynder
04. januar 2001 - 15:55 #5
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.
Avatar billede soepro Nybegynder
04. januar 2001 - 15:56 #6
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.
Avatar billede bjarke Nybegynder
04. januar 2001 - 23:00 #7
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.

NB: Jeg arbejder med Borland C++ Builder 3
Avatar billede bjarke Nybegynder
05. februar 2001 - 17:52 #8
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.

Jeg forsøger at dele efter indsatsen.
Avatar billede bjarke Nybegynder
05. februar 2001 - 17:54 #9
... selvom jeg egentlig aldrig rigtig fik noget svar på punkt 2 ...
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester