PChar meget mystisk

Tags:    delphi

User
Bruger #55 @ 27.08.03 19:50
Hej
Jeg har arbejdet i C++ længe, men er nu gået tilbage i delphi og jeg har nu fået et problem.

Jeg har lavet en funktion, som fylder noget data ind i en buffer og returnere, men når jeg kommer tilbage til hvor jeg kaldte funktion er den tom, jeg har singlesteppet igennem og jeg er sikker på der kommer data i bufferen.

Her er functionen som det drejer sig om:

Fold kodeboks ind/udKode 


Og her er så koden der kalder den :
Fold kodeboks ind/udKode 


Nogen der ved hvorfor? det burde jo være gemt når jeg kommer tilbage, eftersom en PChar er en pointer.

Kaspar



6 svar postet i denne tråd vises herunder
2 indlæg har modtaget i alt 3 karma
Sorter efter stemmer Sorter efter dato
Hej
Jeg har arbejdet i C++ længe, men er nu gået tilbage i delphi og jeg har nu fået et problem.

Jeg har lavet en funktion, som fylder noget data ind i en buffer og returnere, men når jeg kommer tilbage til hvor jeg kaldte funktion er den tom, jeg har singlesteppet igennem og jeg er sikker på der kommer data i bufferen.

Her er functionen som det drejer sig om:

Fold kodeboks ind/udKode 


Og her er så koden der kalder den :
Fold kodeboks ind/udKode 


Nogen der ved hvorfor? det burde jo være gemt når jeg kommer tilbage, eftersom en PChar er en pointer.

Kaspar


Hej Kaspar,

Som sådan ser din funktion rigtig ud.
Jeg har lige prøvet at se om det virker ved at lave et DLL med "receive" funktionen eksporteret og en applikation som benytter DLL'et. Dette fungere fint hos mig og den eneste forskel som jeg kan se det er at jeg ikke benytter funktionen "RemoveFromBuff(getlen);". Du har evt. en fejl i denne funktion. Det andet problem kunne være at du ikke får nul-stillet din PChar buffer fra starten af.
Du kan evt. bruge "res := AllocMem(50);" som automatisk nul-stiller indholdet af din pointer.
Når du ikke får nul-stillet din PChar, kan du opleve underlige ting hvis der ikke returneres nogle data fra Receice funktionen (evt. start med at sætte "buff[0] := #0;" som deet første i Receive).

Det skal sige at i mit test projekt har jeg oprettet InLen som Integer og InBuffer som PChar (med en predefineret streng så jeg kunne teste).

Bruger du DLL'et fra en Delphi applikation?
Det kunne også være at problemet måske har noget at gøre med at du bruger PWideChar i enten DLL'et eller applikationen. Her skal du bruge samme type, f.eks. hvis du bruger DLL'et fra VB så skal du bruge WideChar i Receive funktionen.


Her er koden som jeg har testet med:
DLL'et:
Fold kodeboks ind/udKode 


Test applikationen:
Fold kodeboks ind/udKode 



Håber det hjælper.
/Michael.




> Nogen der ved hvorfor? det burde jo være gemt når jeg kommer tilbage, eftersom
> en PChar er en pointer.

Hej Kaspar !!!
String og PChar er to typer der kan gemme tegn (Mener ikke der er nogle af dem der er pointer i Delphi, men måske har du ret). Hvis du skal oprette en pointer i Delphi skal du bruge ^foran navnet (Hvis jeg husker rigtigt). Jeg forstår ikke helt hvad "receive" skal gøre, men regner med det er noget med den skal modtage noget data og gemme det. Som en slags linked liste. Er det sådan den skal fungere ?

Jeg roder også lidt med Delphi fortiden, er også selv mest til C++. Skriv havd funktionen skal gøre. Bare så jeg er helt sikker.

Best Regaards
Janus S. Andersen

P.s Håber dette er til nogen hjælp, ellers skriv lige lidt mere så vender jeg tilbage
P.p.s Jeg tror et af problemmerne i programmet er at dataen bliver oprettet på stakken og nedlagt igen. Da indsættelse forgår i en funktion

* Life is a dream in a programmers heaven *

[Redigeret d. 27/08-03 22:06:53 af Janus S. Andersen]



User
Bruger #55 @ 27.08.03 22:07
> Nogen der ved hvorfor? det burde jo være gemt når jeg kommer tilbage, eftersom
> en PChar er en pointer.

Hej Kaspar !!!
String og PChar er to typer der kan gemme tegn (Mener ikke der er nogle af dem der er pointer i Delphi, men måske har du ret). Hvis du skal oprette en pointer i Delphi skal du bruge ^foran navnet (Hvis jeg husker rigtigt). Jeg forstår ikke helt hvad "receive" skal gøre, men regner med det er noget med den skal modtage noget data og gemme det. Som en slags linked liste. Er det sådan den skal fungere ?

Jeg roder også lidt med Delphi fortiden, er også selv mest til C++. Skriv havd funktionen skal gøre. Bare så jeg er helt sikker.

Best Regaards
Janus S. Andersen

P.s Håber dette er til nogen hjælp, ellers skriv lige lidt mere så vender jeg tilbage

* Life is a dream in a programmers heaven *


Receive skal blot flytte et stykke buffer fra én til én anden, det er fordi det er en Buffer i en DLL fil, programmet skal så kunne hente et stykke af bufferen fra dll filen. (bufferen i dll filen bliver dog lige konverteret fra binær til en lang hex streng inden den bliver sendt retur).

PChar det er en Char Pointer deraf navnet.

Kaspar



User
Bruger #55 @ 27.08.03 22:11
det skal lige nævnes at nogle af klammerne er forsvundet fra koden da jeg postede den der er et par steder hvor der skal stå [ i ]



Hej Kaspar !!!
Du har ret med PChar, det kan jeg godt se.

Janus S. Andersen
[* Life is a dream in a programmers heaven *



User
Bruger #55 @ 28.08.03 22:42
Det må være en kompiler bug, jeg gør det nøjagtig som dig min mit virker ikke !
Jeg bruger Delphi7 pro jeg har kontaktet borland og håber de vil fortælle mig om det er en Bug.
Jeg vil nu prøve at overføre PChar som typen Pointer i stedet og se om det så vil.

Tak
Kaspar



t