AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Access violation in System._DynArrayClear

Ein Thema von Andre1 · begonnen am 11. Sep 2020 · letzter Beitrag vom 11. Sep 2020
Antwort Antwort
Andre1

Registriert seit: 19. Nov 2016
4 Beiträge
 
#1

Access violation in System._DynArrayClear

  Alt 11. Sep 2020, 13:48
Delphi-Version: 10.2 Tokyo
Hi,

ich rufe aus einer Bibliothek eine Funktion auf. Diese gibt mir
die Adresse zu einem String Array und die Anzahl der Einträge.
Showmessage funktioniert und mir werden die Strings angezeigt.
Allerdings kommt es beim Verlassen der Funktion getRecipients
zu einer Access Violation hier:

System.SysFreeMem(Opt.out
System._FreeMem(???)
System._DynArrayClear(nil, ???)

Ich vermute es hängt mit der Variable "arr" zusammen.
Was muss ich machen, damit keine Access Violation kommt?

Viele Grüße
André

Delphi-Quellcode:
type
  TPWideCharArray = array of PWideChar;
  PPWideChar = ^PWideChar;
  PPPWideChar = ^PPWideChar;
  PNativeInt = ^NativeInt;
  PPNativeInt = ^PNativeInt;

procedure db_call_method_RecipientsManager_getRecipients(ptr: NativeInt;
  argv: PPPWideChar; argc: PPNativeInt); stdcall; external 'sample.dll';
  
function RecipientsManager.getRecipients: TArray<String>;
var
  argv: PPWideChar;
  argc: PNativeInt;
  i: NativeInt;
  str: string;
  arr: TPWideCharArray;
begin
  db_call_method_RecipientsManager_getRecipients(nativeRef, @argv, @argc);

  Result := Tarray<string>.create();
  SetLength(result, argc^);
  arr := TPWideCharArray(argv);

  for i := 0 to argc^ - 1 do
  begin
    str := WideCharToString(arr[i]);
    result[i] := str;
    Showmessage(str);
  end;
end;
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
3.745 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#2

AW: Access violation in System._DynArrayClear

  Alt 11. Sep 2020, 17:33
Ich tipp mal auf verschiedene Speichermanager, einer in deiner Anwendung und einer in deiner dll. Nutzt du sharemem, runtime packages oder andere Mechanismen um das zu vermeiden?
Mein zweiter Tip nach einem zweiten Blick ist, dass dein Hardcast von argv auf ein array of PWideChar einfach falsch ist.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight

Geändert von Stevie (11. Sep 2020 um 17:36 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
36.674 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: Access violation in System._DynArrayClear

  Alt 11. Sep 2020, 18:13
Ich tippte auf den kranken Cast.
arr := TPWideCharArray(argv);

Außerdem werden im Result nur viele PChars aus ein- und derselben Variable verlinkt,
die am Ende auch noch freigegeben wird und somit die PChars alle ungültig sind.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014
  Mit Zitat antworten Zitat
Andre1

Registriert seit: 19. Nov 2016
4 Beiträge
 
#4

AW: Access violation in System._DynArrayClear

  Alt 11. Sep 2020, 18:46
Ich tipp mal auf verschiedene Speichermanager, einer in deiner Anwendung und einer in deiner dll. Nutzt du sharemem, runtime packages oder andere Mechanismen um das zu vermeiden?
Mein zweiter Tip nach einem zweiten Blick ist, dass dein Hardcast von argv auf ein array of PWideChar einfach falsch ist.
Die dll ist in der Sprache D geschrieben, diese hat einen GC. Allerdings ist der GC deterministisch (GC collect läuft nur wenn neuer Speicher angefordert wird). Der nächste GC collect wird frühestens im nächsten Aufruf der Dll passieren.

Unterschiedliche Speicherverwaltungen sollten deswegen kein Problem sein.

Viele Grüße
Andre
  Mit Zitat antworten Zitat
Andre1

Registriert seit: 19. Nov 2016
4 Beiträge
 
#5

AW: Access violation in System._DynArrayClear

  Alt 11. Sep 2020, 18:56
Ich tippte auf den kranken Cast.
arr := TPWideCharArray(argv);

Außerdem werden im Result nur viele PChars aus ein- und derselben Variable verlinkt,
die am Ende auch noch freigegeben wird und somit die PChars alle ungültig sind.
Ja, ich habe versucht es irgendwie zum Laufen zu kriegen mit Code Schnippseln die ich im Internet dazu gefunden habe.

Tatsächlich ist die array cast Zeile, diejenige, welche die access violation auslöst. Wenn ich sie weglassen (und das nachfolgende coding) kommt keine access violation.

Seltsam ist, dass showmessage aber perfekt funktioniert. Sie wird 2 mal gerufen und zeigt jeweils den richtigen String an.

Wie ist der richtige Weg, wenn ich über eine C function eine Liste von Strings bekomme (argv: PPPWideChar; argc: PPNativeInt) und diese in einem Result vom Type TArray<String> zurück geben möchte?

Viele Grüße
Andre
  Mit Zitat antworten Zitat
Andre1

Registriert seit: 19. Nov 2016
4 Beiträge
 
#6

AW: Access violation in System._DynArrayClear

  Alt 11. Sep 2020, 20:05
Danke für die Antworten.
Ich vermute ich habe die Lösung gefunden:

Delphi-Quellcode:
function RecipientsManager.getRecipients: TArray<String>;
var
  argv: PPWideChar;
  argc: PNativeInt;
  i: NativeInt;
begin
  db_call_method_RecipientsManager_getRecipients(nativeRef, @argv, @argc);

  result := TArray<string>.Create();
  SetLength(result, argc^);

  for i := 0 to argc^ - 1 do
  begin
    result[i] := WideCharToString(argv^);
    if i <> argc^ - 1 then
      Inc(argv, 1);
  end;
end;
Viele Grüße
André
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 00:34 Uhr.
Powered by vBulletin® Copyright ©2000 - 2020, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2020 by Daniel R. Wolf