AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Umgang mit PChar - Speichermanagement

Ein Thema von cmrudolph · begonnen am 25. Dez 2007 · letzter Beitrag vom 28. Dez 2007
 
cmrudolph

Registriert seit: 14. Aug 2006
29 Beiträge
 
Delphi 7 Professional
 
#9

Re: Umgang mit PChar - Speichermanagement

  Alt 28. Dez 2007, 12:31
Gut, nun verwende ich kein Array of PChar mehr, sondern eine verkettete Liste. Das funktioniert auch ganz gut.

Ich skizziere einmal den Ablauf des Programmes:
Die Verkettete Liste sieht wie folgt aus:
Delphi-Quellcode:
type
  PItemList = ^TItemList;
  PPItemList = ^PItemList;
  TItemList = record
    Next: PItemList;
    Text: PChar;
  end;
Es wird die Prozedur testproc der DLL aufgerufen. Diese sieht wie folgt aus:

Delphi-Quellcode:
procedure testproc(Text: PChar; res: PPItemList); stdcall;
var
  actItem: PItemList;
begin
  actItem:=res^;
  if not Assigned(actItem) then begin
    GetMem(res^,sizeof(TItemList));
    actItem:=res^;
    actItem^.Next:=nil;
    GetMem(actItem^.Text,StrLen(Text)+1);
    StrLCopy(actItem^.Text,Text,StrLen(Text)+1);
  end;
end;
Im aufrufenden Programm sieht die Prozedur folgendermaßen aus:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  resItems,actItem: PItemList;
  testproc: procedure (Text: PChar; res: PPItemList); stdcall;
  hdll: Cardinal;
begin
  hdll:=LoadLibrary('test.dll');
  @testproc:=GetProcAddress(hdll,'testproc');
  resItems:=nil;
  testproc('Testtext',@resItems);
  if Assigned(resItems) then begin
    actItem:=resItems;
    while Assigned(actItem) do begin
      ShowMessage(actItem^.Text);
      actItem:=actItem^.Next;
      //FreeMem(resItems,sizeof(TItemList));
      //resItems:=actItem;
    end;
  end;
  @testproc:=nil;
  FreeLibrary(hdll);
end;
Wenn ich die beiden auskommentierten Zeilen Quelltext wieder aktiviere, dann bekomme ich beim beenden des Programmes eine Access Violation. Wenn sie auskommentiert sind, dann läuft alles wie es soll. Aber dann bleibt doch der von mir manuell reservierte Speicher reserviert...

mfG, Christian
  Mit Zitat antworten Zitat
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:48 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz