Search code examples
delphidelphi-2009delphi-2010

Unicode problems with Delphi 2009 / 2010 and windows API calls


Hi I have been using this function in Delphi 2006, but now with D2010 it throws an error. I think it is related to the switch to 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;

What should I do to make it work?

EDIT

I get an 'access violation' when the ChangeFileExt is called


Solution

  • 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;
    

    Try this

      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;
    

    or this

      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;
    

    For Delphi, Char and PChar types are WideChar and PWideChar types, respectively.

    If you use any Windows API’s that return data into char buffers , those buffers need to be redeclared as arrays of bytes or an array of AnsiChar.

    If you are calling these Windows API’s and sending in buffers, if have been using the sizeof function when telling the API how long your buffer is. Those calls need to be changed to the Length function, as the Windows widechar API’s require the number of characters, not the number of bytes.

    Bye.