AGB  ·  Datenschutz  ·  Impressum  







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

Leerstring bei Interface

Ein Thema von Maekkelrajter · begonnen am 28. Mai 2024 · letzter Beitrag vom 29. Mai 2024
Antwort Antwort
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.483 Beiträge
 
Delphi 12 Athens
 
#1

AW: Leerstring bei Interface

  Alt 28. Mai 2024, 16:29
Ehrlich gesagt, versteh ich nicht, warum '' oder sonstwo aus irgendwelchen typisierten oder untypisierten Konstanten/Variablen.
Selbst wenn es der falsche String-Typ ist, dann konvertiert Delphi das automatisch.

ACHTUNG: Variant vs. OleVariant

Im Variant können Delphi-Typen enthalten sein, wie z.B. AnsiString und String/UnicodeString,
womit fremde Sprachen natürlich nicht zurechtkommen, da sie das nicht kennen.

Der OleVariant ist ein OLE-kompatibler Variant, welcher ausschließlich Typen enthalten kann, welche OLE kennt, da sie dort definiert wurden.

Also entweder OleVariant verwenden,
oder ihr müsst eine typisierte Konstante benutzen (WideString oder OleVariant), mit dem passenden Typen, welchen OLE kennt.
const EmptyString: WideString = '';

[edit] war grad gedanklich bei einem anderen Probleme, was hier vor einer Weile im Forum war, auch mit einem OLE-Interface.






Auch zu beachten: Die SysUtils kennt ebenfalls ein Delphi-Referenz durchsuchenEmptyStr.
Und ich würde es als gefährlich einstufen diese Konstante zu benutzen.
  • erstmal kann der Kompiler nicht mehr optimieren (if S = 'then wird zu if Pointer(S) = nil then optimiert)
    und bei if S = EmptyStr then wird System._UStrEqual aufgerufen
  • dann sind typisierte Konstanten eigentlich nur schreibgeschützte Variablen (der Schreibschutz ist aber nicht wirklich vorhanden)
    im Delphi XE war dieser Bereich des Arbeitsspeichers nicht schreibgeschützt
  • und ich finde Code damit auch nicht wirklich schnell lesbar ... denke da immer an eine Variable, aber bei '' seh ich sofort das "LEER".

Code:
if S = '' then
004E63CB 837DF800         cmp dword ptr [ebp-$08],$00
004E63CF 7507             jnz $004e63d8

Unit1.pas.31: if S = EmptyStr then
004E63D8 8B45F8           mov eax,[ebp-$08]
004E63DB 8B15DC514F00     mov edx,[$004f51dc]
004E63E1 8B12             mov edx,[edx]
004E63E3 E8BC4DE3FF      call $0031b1a4
004E63E8 7507             jnz $004e63f1
Wir hatten z.B. mal den Spaß, dass diese Konstante ausversehn überschrieben wurde, mit dem Wert 'Empty' ,
und da DevExpress in seinem QuantumGrid überall diese Konstante verwendet, standen dann in allen leeren Zellen (mit NULL) plötzlich ÜBERALL "Empty" drin.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (28. Mai 2024 um 16:49 Uhr)
  Mit Zitat antworten Zitat
Maekkelrajter

Registriert seit: 8. Mär 2017
Ort: Köln
158 Beiträge
 
Delphi 12 Athens
 
#2

AW: Leerstring bei Interface

  Alt 28. Mai 2024, 22:52
Delphi-Quellcode:

  track.Set_EpisodeID(PWideString(nil)^);
Aber ich würde mich nicht wundern, wenn das auf dasselbe hinausläuft wie der Leerstring.
Fast dasselbe. Damit gibt's eine Exception der Klasse $C0000005 mit der Meldung 'access violation at 0x013f9a80: read of address 0x00000000' aufgetreten'.
So geht's also offenbar auch nicht

Gruß LP
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.483 Beiträge
 
Delphi 12 Athens
 
#3

AW: Leerstring bei Interface

  Alt 28. Mai 2024, 23:08
Es ist das Selbe.
Abgesehn von ShortString's ist ein leerer String per se ein NIL.

Theoretisch wäre es möglich, dass es auch nicht nil ist, mit der Length=0, aber grundsätzlich kommt sowas eigentlich nie vor.

Andere Ausnahme ist PChar(''), welches nicht NIL zurück gibt, sondern einen Zeiger auf einen Speicher, wo zwei #0 drin stecken. (was mache API nicht mag)



Kann es sein, dass hier IMMER eine ID reingegeben werden MUß, womit ein Leerstring quasi verboten ist?

Ist deine Interface-Instanz überhaupt OK?
(IITFileOrCDTrack)




Sicher, dass es wirklich safecall ist?



$C0000005 = Fatal + AccessViolation
0x00000000 = z.B. NIL

0x013f9a80 = was ist hier?
Beim Debuggen ein Strg+Alt+M und dann schauen, wo dieses drin ist (also was die nächst kleinere Basisadresse besitzt)
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (28. Mai 2024 um 23:13 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


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 12:05 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