Newsgroup: it.comp.lang.delphi
Titolo: Directory temporanea del win-user e chiamata a kernel32

In una procedura in cui ho bisogno di sapere la directory 
temporanea dell'utente corrente di windows (Xp o precedenti)
uso questo codice con una chiamata ad una funzione API 
del Kernel32 ...
vi illustro un pò la situazione ... 
spero non vi annoi :)
type
  TXyz = class
[...]
    private
      Procedure abc;
[...]  
  End;
[...]
function getTempPath(bufferLength: DWORD; lpBuffer: PChar): DWORD; 
  stdcall external 'kernel32.dll' name 'GetTempPathA';
[...]
Implementation
Procedure TXyz.abc;
Const
  //assegna la lunghezza max del path
  //anche 255 dovrebbe andare bene ma meglio esagerare
  STRING_PATH_BUFFER_SIZE = 1024; 
var
  Path: array[0..STRING_PATH_BUFFER_SIZE] of char;
  PathStr: string;
  I: Integer;
Begin
 [...]
    //preleva il path della directory temp del SO con chiamata al kernel32
    If getTempPath(Sizeof(Path),Path)<>0 Then
    Begin
      //estrae dall'array di caratteri il path fermandosi al char #0
      PathStr := '';
      For I := 0 To STRING_PATH_BUFFER_SIZE Do
        If Path[I] <> #0 Then
          PathStr := PathStr + Path[I]
        Else
          Break;
      //scrive il path+filename corretto per iniziare il lavoro sul file
      FFileName := PathStr + cdsfiles.FieldByName('nome').AsString;
    End;
 [...]
End;
dove cdsfiles e un semplice clientDataset da cui prendo il nome del file
per poi aprirne una copia nella directory temporanea.
Ho fatto un pò di ricerca sul ng e su google ma forse ho sbagliato keyword
perchè non ho trovato granchè di utile e comunque ho delle domande 
di carattere alquanto generale mirate all'ottimizzazione sia del codice scritto
sia del codice a "run-time".
1) c'è una manire + elegante (senza il ciclo su i caratteri 
    dell'array o magari proprio senza l'array) per scrivere 
    del codice che faccia la stessa cosa?
2) possibile che delphi non abbia previsto una funzione o una variabile
    in cui scrive la directory temporanea dell'utente corrente di windows
    o ancora meglio dell'utente in genere che sia su win o linux?
3) E' corretto scrivere quello che ho scritto?
   (certo è che gira e funziona bene ma ... non mi sembra
    molto pulito e diretto come di solito sono le cose in delphi usato bene ;) )
grazie anche del tempo speso a leggere il post corrente :)
	Ciao
	MassimoB
 

 del Kernel32 ...
Io utilizzo questa funzione con successo in un software molto
distribuito:
function GetWindowsDir: TFileName;
var
  WinDir: array[0..MAX_PATH - 1] of char;
begin
  SetString(Result, WinDir, GetWindowsDirectory(WinDir, MAX_PATH));
  if Result = '' then
    raise Exception.Create(SysErrorMessage(GetLastError));
end;
function GetTempDir: TFileName;
var
  TmpDir: array[0..MAX_PATH - 1] of char;
begin
  try
    Result := IncludeTrailingPathDelimiter(GetWindowsDir) + 'TEMP';
    if not DirectoryExists(Result) then begin
      SetString(Result, TmpDir, GetTempPath(MAX_PATH, TmpDir));
      if not DirectoryExists(Result) then
        if not CreateDirectory(PChar(Result), nil) then begin
          Result := IncludeTrailingPathDelimiter(GetWindowsDir) +
'TEMP';
          if not DirectoryExists(Result) then
            if not CreateDirectory(Pointer(Result), nil) then begin
              Result := ExtractFileDrive(Result) + '\TEMP';
              if not DirectoryExists(Result) then
                if not CreateDirectory(Pointer(Result), nil) then begin
                  Result := ExtractFileDrive(Result) + '\TMP';
                  if not DirectoryExists(Result) then
                    if not CreateDirectory(Pointer(Result), nil) then
begin
                      raise
Exception.Create(SysErrorMessage(GetLastError));
                    end;
                end;
            end;
        end;
    end;
  except
    Result := '';
    raise;
  end;
end;
{
	NB. GetTempPath e' gia' definita in windows.pas
}
Saluti.
-- 
I'am what I'am, I do what I can

>Acqua
grazie
	Ciao
	MassimoB
 

 Begin
[...]
getmem(path,max_path);
If getTempPath(max_Path,Path)<>0 Then
FFileName := String(Path) + cdsfiles.FieldByName('nome').AsString;
FreeMem(Path,Max_Path);
[...]
End;
Tra l'altro hai dichiarato una funzione che già esiste (GetTempPath), o
dovrebbe esistere (non ho controllato), nella unit Windows.
Ciao.
Giuseppe

 3) E' corretto scrivere quello che ho scritto?
Vedi sopra.
Acqua
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

   STRING_PATH_BUFFER_SIZE = 1024; 
Io userei Windows.MAX_PATH
