Frage

Hallo Ich habe mit dieser Funktion in Delphi 2006, aber jetzt mit D2010 wirft es einen Fehler. Ich denke, es ist die Umstellung auf Unicode verwandt ist.

  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?

EDIT

Ich erhalte eine ‚Zugriffsverletzung‘, wenn der ChangeFileExt heißt

War es hilfreich?

Lösung

Windows.pas

function GetTempFileName(lpPathName, lpPrefixString: PWideChar;
  uUnique: UINT; lpTempFileName: PWideChar): UINT; stdcall;

function GetTempPath(nBufferLength: DWORD; lpBuffer: PWideChar): DWORD; stdcall;

SysUtils.pas

function ChangeFileExt(const FileName, Extension: string): string;

Versuchen Sie, diese

  Function TWinUtils.GetTempFile(Const Extension: STRING): STRING;
  Var
     Buffer: ARRAY [0 .. MAX_PATH] OF WideChar;
  Begin
    Repeat
      GetTempPath(Length(Buffer), Buffer);
      GetTempFileName(Buffer, '~~', 0, Buffer);
      Result := ChangeFileExt(Buffer, Extension);
    Until not FileExists(Result);
  End;

oder das

  Function GetTempFile(Const Extension: String): String;
  Var
     Buffer: String;
  Begin
      SetLength(Buffer,MAX_PATH);
    Repeat
      GetTempPath( MAX_PATH, PChar( Buffer) );
      GetTempFileName(PChar( Buffer), '~~', 0, PChar( Buffer));
      Result := ChangeFileExt(Buffer, Extension);
    Until not FileExists(Result);
  End;

Für Delphi, Char und PChar-Typen sind WideChar und PWideChar Typen sind.

Wenn Sie Windows-API verwenden, die Daten in char-Puffer zurückgeben, müssen diese Puffer neu deklariert als Arrays von Bytes oder eine Anordnung von AnsiChar werden.

Wenn Sie diese Windows-API aufrufen und Senden in Puffer, falls haben die sizeof-Funktion mit, wenn die API zu sagen, wie lange der Puffer ist. Diese Anrufe müssen die Länge Funktion geändert werden, da Windows widechar API die Anzahl der Zeichen benötigen, nicht die Anzahl der Bytes .

Bye.

Andere Tipps

Mit Delphi 2009 ist Char ein Unicode-Zeichen. Die Funktion erfordert wahrscheinlich eine Reihe von AnsiChar.

habe gerade überprüft es. Sowohl GetTempFileName und GetTempPath erfordern eine PWideString.

Was ist die Fehlermeldung?

Ich würde empfehlen, immer, und ich meine wirklich immer, über die genaue Erwartungen der einzelnen API-Funktion in Bezug auf den dwSize Parameter und / oder den Rückgabewert einen Blick in die Dokumentation zu haben.

Leider viele verschiedene Fälle gibt es, so einfach zu sagen „alle String-Funktionen benötigen / Return Anzahl der Zeichen“ ist nicht ganz richtig und kann den Leser in einen Albtraum von sporadischen ungültiger Zeiger AVs senden.

  • Die meisten der API-Funktionen erwarten / Return Anzahl der Zeichen, aber einige nicht.
  • Einige zählen die abschließende Null-Zeichen, und einige nicht.
  • verhalten sich einige Funktionen anders, wenn ein Null-Zeiger gegen übergeben wird, wenn ein Nicht-NULL-Zeiger übergeben wird.
  • Und es gibt auch einige Funktionen, die jede mögliche Weise auf alle erforderlichen Puffergröße, um anzuzeigen, nicht bieten.

All diese Dinge können leicht in der Dokumentation gefunden werden, aber man sollte es lesen. Ja wirklich. Es kann Ihnen Stunden sparen.

Mit GetTempPathA und GetTempFileNameA, die Ansi-Versionen von GetTempPath und GetTempFileName. Sie sind noch erhältlich in Delphi 2009, und in der Delphi 2009-Hilfedatei erwähnt, aber nicht ausgeschrieben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top