Avatar billede hrc Mester
11. september 2007 - 11:19 Der er 6 kommentarer og
1 løsning

Hukommelsesspørgsmål i DLL

Jeg har lavet et dll hvori funktionerne returnerer en TStream (TMemoryStream), eksempelvis denne:

function DLLVersion(aFilename: pchar) : TStream; stdcall;

Jeg får korrekte data retur på ovenstående, men ved ikke om jeg forbryder mig på nogle hukommelsesstyringsregler på tværs af program og DLL.

Alternativt har jeg overvejet denne løsning hvor der sendes en stream-instans med over:

procedure DLLVersion(aFilename: pchar; aStream: TStream);stdcall;

Er der en der er bedre end den anden, eller er de begge forkerte?

Afslutningsvis et lille relateret spørgsmål: Kan DLL'et selv finde sit filnavn? I ovenstående funktion sender programmet navnet med, og det vil jeg da gerne slippe for.
Avatar billede martinlind Nybegynder
11. september 2007 - 16:34 #1
Delphi har vist nok en unit der hedder sharemem det er noget med at man skal use den som første unit i sin uses, hvis mam kører fra dll til prg. men du kan læse om det i delphi hjælpen, evt. under memorymanager, jeg mener også godt du selv kan få filename, det er vist nok noget med din instance du skal ha' fat i og så nogle api- kald, så det i en af de tidligere delphi-demoer af en ISAPI-DLL app. hvor de fik navnet på en "windows" agtig måde.
Avatar billede a_nor Nybegynder
12. september 2007 - 01:59 #2
Som Martin skriver skal du evt. bruge Sharemem. Dette er tilfældet hvis der bruges Long Strings i dll-en eller der manipuleres med memoryen: GetMem, Freemem, Dispose osv. på tværs af application og dll.

dll-en kan finde sit filnavn ved:

  Lngde := getmodulefilename(hInstance,buf,SizeOf(buf));

idet hInstance er en variabel i ethvert dll. Hvad der måske er mere interessant er at du i dll-en kan få navnet på din exe-fil ved at kalde

  Lngde := getmodulefilename(0,buf,SizeOf(buf));

mvh  Anders
Avatar billede hrc Mester
12. september 2007 - 14:59 #3
Glemte at skrive at jeg gerne vil undgå ShareMem. Kan ligeså godt bruge packages hvis det kun er Delphi der bruger filen (99% chance for at det er tilfældet, men alligevel). Derfor roder jeg heller ikke med strenge her, men med en pointer til en TStream instans.

Streamen antages oprettet i DLL'ets eget hukommelsesområde, men da jeg bruger og frigiver streamen inden DLL'et unloades (hvor hukommelsesområdet antages frigivet) skulle det jo være i orden - medmindre streamens .Free får fat i en forkert frigivelsesrutine fordi kaldes fra et andet hukommelsesområde.

Som sagt: jeg gætter og hvis en eller anden kender den dybere sandhed, lad mig endelig vide.

Martin: Når man når op i 80'ere begynder hukommelsen at svigte hist og her. Jeg er bare tyvstartet... Jeg prøver at søge via søgeordet "memory manager"; håber jeg kan forstå hvad jeg finder. Kan dog også huske at være stødt på en demo hvor man fandt filens navn, men hvor?
Avatar billede martinlind Nybegynder
12. september 2007 - 23:26 #4
jeg tror det var a_nor's metode til at finde navnet jeg tænkte på :)

Med hensyn til dit "måske problem" ( har du oplevet at det er gået ned sådan som du gør ? ) kunne du jo overveje en anden løsning, der findes forskellige måder og nogle demoer i delphi interprocescomm. - et eller andet, det var jo også en mulighed :)
Avatar billede hrc Mester
12. september 2007 - 23:49 #5
Som jeg skriver: jeg får data retur, men det fjerner ikke tvivlen om det er den rigtige måde at gøre det på. Hvis fremgangsmåden er fornuftig, er det sådan jeg vil gøre det i 5-10 fremtidige DLL'er. Inden da vil jeg gerne vide om vejen er sikker.

a_nor: Det har været en lang dag! Alt fra forkølede unger der levnede mig 2 timers søvn, til hundelort under skoen, til indkøb på grønttorvet - uden penge, til cykel der bryder sammen (den står for transporten til og fra børnehave). Gearnavet er i øvrigt færdigt (dvs. enten +700 på en 12 år gammel cykel eller 4-5000 på en ny).
Faktisk bruger jeg allerede sidstnævnte kodestump til at validere det kaldende program, ahem...
Avatar billede hrc Mester
17. september 2007 - 11:21 #6
a_nor: Smid et svar. Du får de halve for at genopfriske min hukommelse med GetModuleFilename.

Fik desværre ikke en til at komme med svar på om jeg bare var heldig eller om det er validt at returnere en stream-instans fra en DLL-fil.
Avatar billede hrc Mester
27. september 2007 - 09:29 #7
Lukker
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