![]() |
Delphi-Version: 10.2 Tokyo
Access violation in System._DynArrayClear
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; |
AW: Access violation in System._DynArrayClear
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. |
AW: Access violation in System._DynArrayClear
Ich tippte auf den kranken Cast.
Delphi-Quellcode:
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. |
AW: Access violation in System._DynArrayClear
Zitat:
Unterschiedliche Speicherverwaltungen sollten deswegen kein Problem sein. Viele Grüße Andre |
AW: Access violation in System._DynArrayClear
Zitat:
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 |
AW: Access violation in System._DynArrayClear
Danke für die Antworten.
Ich vermute ich habe die Lösung gefunden:
Delphi-Quellcode:
Viele Grüße
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; André |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:28 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-2025 by Thomas Breitkreuz