![]() |
Re: Probleme mit TStrings.IndexOfName unter Vista
Zitat:
Würde sonst wohl in der aktuellen ![]() MS hat ja schon öfters mal API-Funktionalität umdefiniert. |
Re: Probleme mit TStrings.IndexOfName unter Vista
Der Wert LOCALE_INVARIANT wird im aktuellen SDK vom Februar in der WinNT.h mittels (MAKELCID(MAKELANGID(LANG_INVARIANT, SUBLANG_NEUTRAL), SORT_DEFAULT)) erzeugt. Also keine Konstante.
|
Re: Probleme mit TStrings.IndexOfName unter Vista
Zitat:
|
Re: Probleme mit TStrings.IndexOfName unter Vista
Tss, klappt sogar unter .NET
Delphi-Quellcode:
Das muss ich anders lösen.
if (String.Compare("HÜBNER", "HUEBNER") == 0)
{ MessageBox.Show("Gleich"); } |
Re: Probleme mit TStrings.IndexOfName unter Vista
Hallo Bernhard,
Zitat:
Win32 SDK : Topic CompareString : Section Remarks Notice that if the return value is 2, the two strings are "equal" in the collation sense, though not necessarily identical. Ich denke der für TStrings verantwortliche Entwickler ist einfach ein Opfer seiner Code-Reuse-Praxis geworden. Zitat:
Für den Fall, dass es sich dabei um einen special value handeln sollte: Ich habe das jetzt nicht ausprobiert. Freundliche Grüße |
Re: Probleme mit TStrings.IndexOfName unter Vista
[Offtopic]
Hey ein Radebeuler. Ist ja gleich um die Ecke. *wink* aus Dresden. :D [/Offtopic] |
Re: Probleme mit TStrings.IndexOfName unter Vista
Zitat:
Delphi-Quellcode:
Selbst wenn Vista unter einer deutschen Locale Umlaute erkennen kann, sollte das mit englischen Spracheinstellungen mit Sicherheit nicht so sein.
if (CompareStringW(MAKELCID(2057, 0), NORM_IGNORECASE, 'HÜBNER', Length('HÜBNER'), 'HUEBNER', Length('HUEBNER')) - 2) = 0 then
begin ShowMessage('Fehler'); end; Die Unterschiede zwischen Vista und XP sind übrigens nicht auf deutsche Umlaute beschränkt. Bspw. wird chinesischer Text bei gleichen Einstellungen und gleicher Locale komplett anders sortiert. |
Re: Probleme mit TStrings.IndexOfName unter Vista
Hallo NetSpy.
Also einen API-Hook für CompareStringW habe ich nicht geschrieben, sondern nur eine Überladung von Delphi-Funktionen. D.h. genauer nutze ich sie jetzt aber nicht, da mir beides wegen der unbekannten Nebenwirkungen zu unsicher ist. Einige unserer Komponenten sind nicht im Quelltext verfügbar. Und was weiss ich, was da passiert. Wir haben jetzt alle betreffenden Funktionen (z.B. TStringList.IndexOf) noch mal gekapselt. Die Sortierung haben wir sowieso schon immer selbst gemacht. Hier aber trotzdem das Beispiel zum Überladen einer Funktion:
Delphi-Quellcode:
procedure OverwriteProcedure(OldProcedure, NewProcedure: pointer; Data: POverwrittenData = nil);
{ OverwriteProcedure originally from Igor Siticov } { Modified by Jacques Garcia Vazquez } var x: PAnsiChar; y: integer; ov2, ov: cardinal; p: pointer; begin if Assigned(Data) then if (Data.Location <> nil) then exit; { procedure already overwritten } // need six bytes in place of 5 x := PAnsiChar(OldProcedure); if not VirtualProtect(Pointer(x), 6, PAGE_EXECUTE_READWRITE, @ov) then RaiseLastOSError; // if a jump is present then a redirect is found // $FF25 = jmp dword ptr [xxx] // This redirect is normally present in bpl files, but not in exe files p := OldProcedure; if Word(p^) = $25FF then begin Inc(Integer(p), 2); // skip the jump // get the jump address p^ and dereference it p^^ p := Pointer(Pointer(p^)^); // release the memory if not VirtualProtect(Pointer(x), 6, ov, @ov2) then RaiseLastOSError; // re protect the correct one x := PAnsiChar(p); if not VirtualProtect(Pointer(x), 6, PAGE_EXECUTE_READWRITE, @ov) then RaiseLastOSError; end; if Assigned(Data) then begin Move(x^, Data.OldCode, 6); { Assign Location last so that Location <> nil only if OldCode is properly initialized. } Data.Location := x; end; x[0] := AnsiChar($E9); y := integer(NewProcedure) - integer(p) - 5; x[1] := AnsiChar(y and 255); x[2] := AnsiChar((y shr 8) and 255); x[3] := AnsiChar((y shr 16) and 255); x[4] := AnsiChar((y shr 24) and 255); if not VirtualProtect(Pointer(x), 6, ov, @ov2) then RaiseLastOSError; end; function MyWideSameText(const S1, S2: WideString): Boolean; begin Result := false; end; procedure TForm1.FormCreate(Sender: TObject); begin OverwriteProcedure(@SysUtils.WideSameText, @MyWideSameText); end; |
Re: Probleme mit TStrings.IndexOfName unter Vista
Danke für die Antwort. Das bringt mich aber leider nicht weiter. Ich brauche schon die echte CompareString-Funktion, da ich die für die jeweilige Spracheinstellung passende Sortierung brauche und das für alle möglichen Sprachen selbst zu programmieren ist wohl ein Ding der Unmöglichkeit.
Wenn ich die Antwort in microsoft.public.win32.programmer.international auf deine Frage sehe, dass wohl die "collation tables" grundlegend geändert wurden, dann sieht es aber schlecht mit einer einheitlichen Lösung aus. |
Re: Probleme mit TStrings.IndexOfName unter Vista
Zitat:
Ich arbeite mich grad zu diesem Thema durch MSDN und dem Blog desjenigen, der geantwortet hat ![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:38 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