AGB  ·  Datenschutz  ·  Impressum  







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

Probleme mit PWideChar

Ein Thema von Benmik · begonnen am 12. Mai 2020 · letzter Beitrag vom 12. Mai 2020
Antwort Antwort
Benutzerbild von Assarbad
Assarbad

Registriert seit: 8. Okt 2010
Ort: Frankfurt am Main
1.234 Beiträge
 
#1

AW: Probleme mit PWideChar

  Alt 12. Mai 2020, 17:46
Ich dachte, ich hätte alles Wichtige an Code mitgeliefert. Was fehlt dir?

EDIT: Das sind Delphi-Funktionen.
Alles klar. Dann übergebe ich mal an die Delphianer die es noch immer sind.

Das mit der Nullterminierung ist also schon ausgeschlossen? Kurzum: nach wiederholter Lektüre deines Beitrags eingangs, scheinst du dich über die Zählung in Bytes zu ärgern und über die Tatsache, daß die Strings nicht nullterminiert daherkommen, oder? Umgekehrt gefragt: woher die Annahme daß das nicht sein kann? Eigentlich ist das so ganz normal.

Übrigens ist Round() falsch. Wenn du einen ungeraden Zahlwert in dem Feld siehst, darfst du getrost davon ausgehen, daß der Wert nicht stimmt.
Oliver
"... aber vertrauen Sie uns, die Physik stimmt." (Prof. Harald Lesch)

Geändert von Assarbad (12. Mai 2020 um 17:49 Uhr)
  Mit Zitat antworten Zitat
Benmik

Registriert seit: 11. Apr 2009
570 Beiträge
 
Delphi 12 Athens
 
#2

AW: Probleme mit PWideChar

  Alt 12. Mai 2020, 17:53
...scheinst du dich über die Zählung in Bytes zu ärgern und über die Tatsache, daß die Strings nicht nullterminiert daherkommen, oder?
Nein, mein Code erscheint mir als Gefrickel und ich denke, dass es eine bessere Lösung gibt.

Das Round ist notwendig, damit ein Integer rauskommt. Ich hätte auch Trunc() nehmen können.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Probleme mit PWideChar

  Alt 12. Mai 2020, 18:00
Ja, der Debugger sieht den Typ "PWideChar" und nimmt das als Nullterminiert an,
was aber egal ist, so lange doe Werte in FileName und FileNameLength korrekt sind und zusammenpassen, gehen die entsprechenden Funktionen damit "richtig" um, welche diesen Typ dann auch korrekt via Längenangabe auswerten.

Wie Assarbad schon sagte, wenn dieser Typ nicht nullterminiert ist (sein muß), dann muß man eben auch die Längenangabe verwenden, wenn man den String auslesen will.

Neben WideCharLenToString gibt es auch noch Delphi-Referenz durchsuchenSetString,
aber diese brauchst du ja nur, wenn du selber diesen "String" auslesen und in einen Delphi-String umwandeln willst.


Das, was du als Zeiger an USNRecFromPointer übergibst, das wird nicht zufällig zwischendurch freigegeben, nachdem du diese Funktion aufgerufen hattest?
Der Dateiname bleibt weiterhin in der anderen Struktur und dieses USNRecFromPointer scheint nur einen Record zu erstellen, der darauf zeigt. (jedenfalls sieht die halbgezeigt Zeile Code danach aus)

Würde dann in etwa so aussehn.
SetString(S, PWideChar(NativeInt(AUSN) + AUSN.FileNameOffset), AUSN.FileNameLength div SizeOf(WideChar)); // oder einfach nur "div 2"


PS: statt NativeInt bzw. NativeUInt verwende ich lieber einen Typ IntPtr (was im Prinzip auch nur ein NativeInt ist, aber so besser anzeigt, was er machen will).
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (12. Mai 2020 um 18:08 Uhr)
  Mit Zitat antworten Zitat
Benmik

Registriert seit: 11. Apr 2009
570 Beiträge
 
Delphi 12 Athens
 
#4

AW: Probleme mit PWideChar

  Alt 12. Mai 2020, 18:18
Da bringt mich ja schon mal gut weiter.

Die aufrufende Routine heißt function TFrmMFT.MFTEnumCallback(AUSN: PUSNRecord; Extra: Pointer): Boolean; , und sie ruft als Erstes USNRecFromPointer(AUSN); auf. Dazwischen geschieht nichts.

Bei einem Beispiel-Dateinamen werden 41 Zeichen übergeben, das letzte ist nicht #0; die FileNameLength ist 22 und der Dateiname 11 Zeichen lang.

EDIT: SetString funktioniert auch einwandfrei.

Geändert von Benmik (12. Mai 2020 um 18:32 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 06:35 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 by Thomas Breitkreuz