Unicode-Probleme mit Delphi 2009 / 2010 und windows-API-Aufrufe
Hallo ich habe diese Funktion in Delphi 2006, aber jetzt mit D2010 wirft es einen Fehler.
Ich denke, es ist im Zusammenhang mit der Umstellung auf Unicode.
Function TWinUtils.GetTempFile(Const Extension: STRING): STRING;
Var
Buffer: ARRAY [0 .. MAX_PATH] OF char;
Begin
Repeat
GetTempPath(SizeOf(Buffer) - 1, Buffer);
GetTempFileName(Buffer, '~~', 0, Buffer);
Result := ChangeFileExt(Buffer, Extension);
Until not FileExists(Result);
End;
Was soll ich tun damit es funktioniert?
BEARBEITEN
Bekomme ich eine "access violation", wenn das ChangeFileExt heißt
- sollten Sie Bearbeiten Ihre Frage zum zählen der Fehlermeldung (eine gute Gewohnheit - macht Sinn, oder?)
- Bitte Folgen Sie dem link für eine Diskussion des Problems (fast der gleiche code) und eine bessere version berücksichtigt, dass einige mehr von dem, was die API-Dokumentation sagt bezüglich der maximalen Puffergröße. forums.embarcadero.com/thread.jspa?threadID=18246
Du musst angemeldet sein, um einen Kommentar abzugeben.
Windows.Pas
SysUtils.Pas
Versuchen, diese
oder diese
Für Delphi, Char-und PChar-Typen WideChar-und PWideChar-Typen, beziehungsweise.
Wenn Sie eine Windows API, die Daten zurück in die char-Puffer diese Puffer werden müssen, erneut deklariert als array of Byte oder array of AnsiChar.
Rufen Sie diese Windows-API und senden in den Puffer, wenn Sie wurden mit Hilfe der Funktion sizeof, wenn Sie sagen, die API wie lange dein Puffer ist. Diese Aufrufe müssen geändert werden, um die Länge-Funktion, wie die Windows widechar-API benötigen, die Anzahl der Zeichen, nicht die Anzahl der bytes.
Bye.
WideChar
. Es gibt keineUnicodeChar
Typ, und hat nie gewesen.Mit Delphi 2009, Char ein unicode-char. Die Funktion wahrscheinlich erfordert ein array of AnsiChar.
Gerade überprüft es. Beide GetTempFilename und GetTempPath erfordern eine PWideString.
Was ist die Fehlermeldung?
PWideChar
?PWideString
ist etwas ganz anderes.Empfehle ich immer, und damit meine ich wirklich immer, einen Blick in die docs über die genauen Erwartungen der einzelnen API-Funktion in Bezug auf die dwSize parameter und/oder Rückgabewert.
Leider gibt es eine Menge von verschiedenen Fällen, also einfach nur sagen "alle string-Funktionen müssen/return Anzahl der Zeichen" ist nicht ganz korrekt und senden kann, die den Leser in einen Alptraum des sporadischen ungültigen Zeiger AVs.
nicht.
nicht-null-Zeiger übergeben wird.
All diese Dinge gefunden in den docs leicht, aber man sollte es Lesen. Wirklich. Es kann sparen Sie Stunden.
Verwenden
GetTempPathA
undGetTempFileNameA
, die Ansi-Versionen derGetTempPath
undGetTempFileName
. Sie stehen immer noch in Delphi 2009, und in der erwähnten Delphi 2009-Hilfe-Datei, aber nicht beworben.