Einzelnen Beitrag anzeigen

cmrudolph

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

Re: Umgang mit PChar - Speichermanagement

  Alt 28. Dez 2007, 11: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