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
Seite 1 von 2  1 2      
Maekkelrajter

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

Leerstring bei Interface

  Alt 28. Mai 2024, 13:37
In einem Projekt mache ich ausgiebig Gebrauch von dem Itunes COM Interface, um von meinem Programm aus die Itunes-Software 'fernsteuern' zu können. Das funktioniert i. d. R. problemlos. Laut der 'iTunes COM Interface Documentation' sind Strings als 'BSTR' deklariert, die ja mit dem 'Widestring' von Delphi kompatibel sind. Das Auslesen dieser Strings ist kein Problem, eine Zuweisung zu einem solchen String normalerweise auch nicht. Nur wenn ich einen solchen String 'löschen' will, indem ich einen Leerstring zuweise, gibt es eine Delphi-Exception 'EOleException Ungültiger Zeiger'.
In der Typelibrary 'iTunesLib_TLB' ist z. B. der String 'EpisodeID' folgendermaßen deklariert:
Delphi-Quellcode:
// *********************************************************************//
// Interface: IITFileOrCDTrack
// Flags: (4432) Hidden Dual OleAutomation Dispatchable
// GUID: {00D7FE99-7868-4CC7-AD9E-ACFD70D09566}
// *********************************************************************//
  IITFileOrCDTrack = interface(IITTrack)
    ['{00D7FE99-7868-4CC7-AD9E-ACFD70D09566}']
[...]
    function Get_EpisodeID: WideString; safecall;
    procedure Set_EpisodeID(const EpisodeID: WideString); safecall;
[...]
    property EpisodeID: WideString read Get_EpisodeID write Set_EpisodeID;
[...]
  end;
Bisher habe ich mich damit beholfen, dass ich anstatt eines Leerstrings (EpisodeID := '') einen Nullwert übergebe (EpisodeID := #0).
Dadurch verschwindet der Eintrag zwar in der Listenansicht, aber in der Itunes - Datenbank bzw. der daraus generierten XML-Datei steht nach wie vor ein 'leerer' String mit der Länge 1: <key>EpisodeID</key><string> </string>.
Mit einem VB-Script funktioniert die Zuweisung eines Leerstrings (track.EpisodeID="") dagegen erwartungsgemäß: Der Eintrag wird komplett entfernt.
Ich habe leider wenig Erfahrung mit Interfaces unter Delphi. Ist es generell unzulässig, einen Leerstring zuzuweisen, oder geht das irgendwie ganz anders? Oder handelt es sich um einen Fehler der Type-Libraray?
Als Workaround könnte ich aus meinem Programm ein VB-Script starten, aber das wäre wirklich nur eine Notlösung.
Es wäre schön, wenn mir da jemand weiterhelfen könnte.

Gruß LP
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.442 Beiträge
 
Delphi 12 Athens
 
#2

AW: Leerstring bei Interface

  Alt 28. Mai 2024, 14:07
Eigentlich sollte das kein Problem sein, aber vielleicht hilft es, den Leerstring als lokale Konstante anzulegen und diese dann zuzuweisen:
Delphi-Quellcode:
procedure ClearTrack(track: IITFileOrCDTrack);
const
  EmptyString = '';
begin
  track.EpisodeID := EmptyString;
end;
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Maekkelrajter

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

AW: Leerstring bei Interface

  Alt 28. Mai 2024, 14:27
Eigentlich sollte das kein Problem sein, aber vielleicht hilft es, den Leerstring als lokale Konstante anzulegen und diese dann zuzuweisen:
Delphi-Quellcode:
procedure ClearTrack(track: IITFileOrCDTrack);
const
  EmptyString = '';
begin
  track.EpisodeID := EmptyString;
end;
Das hatte ich auch schon probiert. Funktioniert leider auch nicht

Gruß LP
  Mit Zitat antworten Zitat
Benutzerbild von Olli73
Olli73

Registriert seit: 25. Apr 2008
Ort: Neunkirchen
741 Beiträge
 
#4

AW: Leerstring bei Interface

  Alt 28. Mai 2024, 15:52
Auf nil setzen?
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.442 Beiträge
 
Delphi 12 Athens
 
#5

AW: Leerstring bei Interface

  Alt 28. Mai 2024, 16:58
Auf nil setzen?
Ein WideString ist nicht zuweisungskompatibel mit nil. Allerdings kann man das mit einem Trick in diesem Fall bewerkstelligen:
Delphi-Quellcode:

  track.Set_EpisodeID(PWideString(nil)^);
Aber ich würde mich nicht wundern, wenn das auf dasselbe hinausläuft wie der Leerstring.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Leerstring bei Interface

  Alt 28. Mai 2024, 17: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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

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

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

AW: Leerstring bei Interface

  Alt 28. Mai 2024, 23: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

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

AW: Leerstring bei Interface

  Alt 29. Mai 2024, 00: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)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (29. Mai 2024 um 00:13 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von uligerhardt
uligerhardt

Registriert seit: 19. Aug 2004
Ort: Hof/Saale
1.746 Beiträge
 
Delphi 2007 Professional
 
#9

AW: Leerstring bei Interface

  Alt 29. Mai 2024, 08:16
Eigentlich sollte das kein Problem sein, aber vielleicht hilft es, den Leerstring als lokale Konstante anzulegen und diese dann zuzuweisen:
Delphi-Quellcode:
procedure ClearTrack(track: IITFileOrCDTrack);
const
  EmptyString = '';
begin
  track.EpisodeID := EmptyString;
end;
Das hatte ich auch schon probiert. Funktioniert leider auch nicht

Gruß LP
Schuss ins Blaue: Vielleicht eine Variable statt einer Konstanten?
Uli Gerhardt
  Mit Zitat antworten Zitat
Kas Ob.

Registriert seit: 3. Sep 2023
346 Beiträge
 
#10

AW: Leerstring bei Interface

  Alt 29. Mai 2024, 10:04
Well it could be helpful and insightful if you can share a small memory dump for the data pointed by that EpisodeID, use the debugger and capture a screenshot of that address content and most importantly few bytes before it like 4 (if it is BSTR for real) like this
2024-05-29-11_00_53-untitled-paint.jpg

Anyway, from reading this :
https://learn.microsoft.com/en-us/pr...p/automat/bstr

Can you try SysFreeString and see if that clear the string without problem ?
https://learn.microsoft.com/en-us/wi...-sysfreestring
Kas
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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