Return værdi fra en funktion, i Delphi

Tags:    delphi

<< < 12 > >>
Hej, nu smider jeg lige to spørgsmål den samme aften helt ufatteligt så meget jeg får skrevet.
Hmm titlen skulle have været:
Return værdi fra en funktion, i Delphi fra en dll.
Men kan ikke få lov til at redigere den længere. så ... men videre med spørgsmålet..

Dette spørgsmål går ud på at jeg har et program med en helveds masse funktioner, en god 400 liniers kode bare med godt kompakte funktioner. disse vil jeg gerne have lagt i en dll-fil så jeg kan bruge filen i flere forskellige programmer.
Har siddet og leget en del med det, og læst de artikler jeg nu kan finde. Jeg fandt ud af at lave en dll-fil med alle funktionerne, ikke det sværeste, og jeg fandt ud af at kalde funktionen fra mit program.
problemet er at jeg kan kalde funktionen fra dll-filen (og som alle funktioner vil jeg gerne returne en værdi), og det fik jeg den endelig efter lang tid til, men så efter det funktionen blev udført kom fejlmeddelse: "invallid pointer operation" (error message).. og så sad jeg fast.
Håber der er nogen der kan hjælpe, lader til at være en generel og brugbar ting så der må da være en løsning på dette problem.
har vedlagt mine koder så hvis det kun er en mindre ting, at du lige kan påpenge hvad det er :)

DLL
Fold kodeboks ind/udKode 


App
Fold kodeboks ind/udKode 


Dll filen ligger i den samme mappe, og den udfører sin showmessage, retunere og programmet udfører sin showmessage og derefter fejlmeddelse bumbang..

håber du vil hjælpe.
Mvh. Henrik K. Christensen - Www.Knakke.dk



Indlæg senest redigeret d. 04.09.2008 19:55 af Bruger #10350
13 svar postet i denne tråd vises herunder
2 indlæg har modtaget i alt 3 karma
Sorter efter stemmer Sorter efter dato
Hvis jeg ikke er helt gal på den ligger problemet i at du sender strings frem og tilbage fra programmet og dll'en. Derfor skal du have en delt memory manager.

Dette gøres ved at inkludere unit'tet sharemem i begge dele

Fold kodeboks ind/udKode 

Fold kodeboks ind/udKode 


Sådan var det ihvertfald i gamle dage



Hey Henrik K,
det er vigtigt at sharemem ligger som det FØRSTE i din dll fils uses clause.

Jeg har smidt et eksempel på det samme, du kan hente det her: http://kenman.dk/temp/dlltest.zip



Jeg vil give Jeppe helt ret i det. Strings giver problemer hvis sharemem ikke er først i uses.

Når man opretter et dll-projekt i delphi kommer der også denne smøre:

{ Important note about DLL memory management: ShareMem must be the first unit in your library's USES clause AND your project's (select Project-View Source) USES clause if your DLL exports any procedures or functions that pass strings as parameters or function results. This applies to all strings passed to and from your DLL--even those that are nested in records and classes. ShareMem is the interface unit to the BORLNDMM.DLL shared memory manager, which must be deployed along with your DLL. To avoid using BORLNDMM.DLL, pass string information using PChar or ShortString parameters. }




Ja ShareMem, hjalp da lidt på det... nu er det først når jeg lukker programme at jeg får fejlen. altså ikke lige efter den har kørt koden.. forslag på det? :)



Hmm, det kan være der er komplikationer på grund af den ShowMessage du kalder, men ellers kan jeg ikke sætte fingeren på nogen åbenlyse problemer. Prøv og fjern ShowMessage fra dll'en og se om det ikke skulle løse problemet



Og du har vel husket at rebuilde begge projekter fuldstændigt efter du tilføjede sharemem? :)



Yep havde jeg husket, nu har jeg prøvet at fjerne showmessage'den fra dll'en.. men den brokker sig stadig når jeg vil lukke programmet, og har sharemen i starten af uses. så kan heller ikke selv finde noget :/



Du kan jo prøve og bruge PChar istedet for string som den kommentar, stefan skriver, foreslår og se om det ikke tilfældigvis skulle løse problemet. Det er sikkert der det ligger. Og så fjern sharemem fra uses listen hvis du gør det



Hmm ja jo.. tror det går fremaf det her.. nu kommer fejlen ikke længere, men hvad mente du. sætte PChar, som funktions typen? .. for det er hvad jeg lige har prøvet, og det virker pånær at showmessage'n, så bare er tom?.. er der en inttostr agtig en der skal sættes på så?



nej den burde automatisk lave en string ud af pchar'en

Evt. som sidste ting lige prøve og se hvad det her giver:
Fold kodeboks ind/udKode 




<< < 12 > >>
t