Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Übergabe von Interface an DLL führt zu AccessViolation (https://www.delphipraxis.net/190478-uebergabe-von-interface-dll-fuehrt-zu-accessviolation.html)

Aviator 7. Okt 2016 19:37

AW: Übergabe von Interface an DLL führt zu AccessViolation
 
Zitat:

Zitat von Fritzew (Beitrag 1350169)
Zitat:

Zitat von Aviator (Beitrag 1350168)
Zitat:

Zitat von himitsu (Beitrag 1350159)
DelphiStrings sind zwar intern zu PChar kompatibel (
Delphi-Quellcode:
PChar(String)
ist also OK), aber andersrum natürlich nicht (niemals
Delphi-Quellcode:
String(PChar)
).

Wie denn dann? Hast du ein Beispiel?

Das ist schlicht falsch. Der Delphi Compiler ersetzt deinen Cast String(Pchar) durch

Delphi-Quellcode:
procedure _UStrFromPWChar(var Dest: UnicodeString; Source: PWideChar);
Beweis: mit debug dcu compilieren und in den cast mit f7 reinsteppen

Gruss Fritz

Ok. Werde ich dann mal so ausprobieren. Wenn es nicht funktioniert, dann melde ich mich nochmal. :-D

Aviator 7. Okt 2016 19:39

AW: Übergabe von Interface an DLL führt zu AccessViolation
 
Zitat:

Zitat von Zacherl (Beitrag 1350170)
Zitat:

Zitat von Aviator (Beitrag 1350168)
Zitat:

Zitat von himitsu (Beitrag 1350159)
DelphiStrings sind zwar intern zu PChar kompatibel (
Delphi-Quellcode:
PChar(String)
ist also OK), aber andersrum natürlich nicht (niemals
Delphi-Quellcode:
String(PChar)
).

Wie denn dann? Hast du ein Beispiel?

Doch doch, das kannst du ruhig machen. Delphi Hilfe sagt zur StrPas Funktion beispielsweise
Zitat:

This function is provided for backwards compatibility only. To convert a null terminated string to an AnsiString or native Delphi language string, use a typecast or an assignment.
Und im Assembly sieht man auch, dass Delphi da Compiler Magic betreibt:
Code:
Unit1.pas.30: S := 'hallo';
005C9BA3 B8D89B5C00       mov eax,$005c9bd8
005C9BA8 8945F8           mov [ebp-$08],eax
Unit1.pas.31: T := String(S);
005C9BAB 8D45F4           lea eax,[ebp-$0c]
005C9BAE 8B55F8           mov edx,[ebp-$08]
005C9BB1 E8EE0AE4FF      call @UStrFromPWChar

Alles klar. Danke schön für die Infos. :thumb:

Mit dem Assembly Code kann ich allerdings, leider muss ich sagen, nicht wirklich viel anfangen. Verstehe da nichts von. Würde es aber gerne. Nur sieht es für mich immer sehr kompliziert aus. :(

Zacherl 8. Okt 2016 00:17

AW: Übergabe von Interface an DLL führt zu AccessViolation
 
Wichtig ist eigentlich nur die letzte Zeile - da sieht man, dass intern die UStrFromPWChar Funktion aufgerufen wird, um den PChar in String zu konvertieren.
Code:
Unit1.pas.30: S := 'hallo';
005C9BA3 B8D89B5C00       mov eax,$005c9bd8 < EAX = S, wird mit Adresse von 'hallo' initialisiert
005C9BA8 8945F8           mov [ebp-$08],eax < S wird auf dem Stack gesichert
Unit1.pas.31: T := String(S);
005C9BAB 8D45F4           lea eax,[ebp-$0c] < Adresse von T wird in EAX geschrieben
005C9BAE 8B55F8           mov edx,[ebp-$08] < S wird vom Stack geholt und in EDX geschrieben
005C9BB1 E8EE0AE4FF      call @UStrFromPWChar < Aufruf der Funktion mit EAX und EDX als Parameter


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:27 Uhr.
Seite 2 von 2     12   

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