Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Speichern von Dateien - Windows Vista (https://www.delphipraxis.net/133468-speichern-von-dateien-windows-vista.html)

f4k3 2. Mai 2009 14:18


Speichern von Dateien - Windows Vista
 
Moin Moin liebe DPler ;)

Schreib momentan ein Proggi für meine Abschlussarbeit und häng an einem Punkt :(
und zwar wenn ich mein Programm auf Windows Vista ausführe (wird auch auf Vista gecoded),
wird meine "Settings"-Datei vom Typ TextFile nicht gespeichert.

Und zwar hab ich es getestet wenn meine Exe direkt im C: Verzeichnis liegt ... also C:\CRMfSD.exe ... und wenns in meinen eigenen Dateien unter Dokumente liegt.

Direkt auf C: :
Exception tritt auf, Dateizugriff verweigert.

Eigene Dateien\Dokumente:
Meine Meldung dass Datei erfolgreich gespeichert wurde, wird angezeigt (Exception Handling) aber die Datei befindet sich nicht
im Verzeichnis.

Die Datei wird in einem Unterordner "Einstellungen" (gleicher Pfad wie Exe) gespeichert.

Gibt es eine Möglichkeit für derlei Aktionen "Rechte" anzufordern.

Also ich denk mir zumindest dass man die UAC ja irgendwie "anpingen" kann ... weil momentan reagiert die UAC gar nicht auf meine
Zugriffe.

Vielen Dank,
Euer F4k3 ;)

himitsu 2. Mai 2009 14:39

Re: Speichern von Dateien - Windows Vista
 
Tja, auf C:\ hat man halt "normal" keine Schreibrechte mehr :angel:

Beste Lösung: speicher die Datei ein einem Verzeichnis, wo das Programm die nötigen Rechte dazu schon hat ... umsonst wurden die Rechte ja nicht eingeschränkt.

Und nur die Rechte zum umgehen, weil man keine Lust hat sich ein passendes Verzeichnis zu suchen ... :shock:

jaenicke 2. Mai 2009 14:46

Re: Speichern von Dateien - Windows Vista
 
Hier findest du dazu etwas von mir inkl. Demo:
http://www.delphi-library.de/viewtopic.php?p=548600

Ein Programm, das sich Adminrechte holt um Einstellungen z.B. zu speichern, würde bei mir sofort auf den Müll fliegen (und ich hoffe doch beim Prüfer ebenso)...

f4k3 2. Mai 2009 14:53

Re: Speichern von Dateien - Windows Vista
 
Zitat:

Zitat von himitsu
Tja, auf C:\ hat man halt "normal" keine Schreibrechte mehr :angel:

Beste Lösung: speicher die Datei ein einem Verzeichnis, wo das Programm die nötigen Rechte dazu schon hat ... umsonst wurden die Rechte ja nicht eingeschränkt.

Und nur die Rechte zum umgehen, weil man keine Lust hat sich ein passendes Verzeichnis zu suchen ... :shock:

mhm ...
naja ... sollte eigentlich ne Quick nd Dirty Lösung werden, da ich nicht glaube dass das Prüfungskomitee sonderlich wert
drauf legt, es sollte ja nur für mich sein, dass ich eine Automation drin hab um zu meinen Datenbanken zu connecten ohne jedesmal
die Einstellungen eingeben zu müssen.

naja ... werd mir ne andere Lösung überlegen.

f4k3 2. Mai 2009 14:54

Re: Speichern von Dateien - Windows Vista
 
Zitat:

Zitat von himitsu
Tja, auf C:\ hat man halt "normal" keine Schreibrechte mehr :angel:

Beste Lösung: speicher die Datei ein einem Verzeichnis, wo das Programm die nötigen Rechte dazu schon hat ... umsonst wurden die Rechte ja nicht eingeschränkt.

Und nur die Rechte zum umgehen, weil man keine Lust hat sich ein passendes Verzeichnis zu suchen ... :shock:

mhm ...
naja ... sollte eigentlich ne Quick nd Dirty Lösung werden, da ich nicht glaube dass das Prüfungskomitee sonderlich wert
drauf legt, es sollte ja nur für mich sein, dass ich eine Automation drin hab um zu meinen Datenbanken zu connecten ohne jedesmal
die Einstellungen eingeben zu müssen.

naja ... werd mir ne andere Lösung überlegen.

f4k3 2. Mai 2009 14:55

Re: Speichern von Dateien - Windows Vista
 
Zitat:

Zitat von jaenicke
Hier findest du dazu etwas von mir inkl. Demo:
http://www.delphi-library.de/viewtopic.php?p=548600

Ein Programm, das sich Adminrechte holt um Einstellungen z.B. zu speichern, würde bei mir sofort auf den Müll fliegen (und ich hoffe doch beim Prüfer ebenso)...

mhm ... naja ... find ich besser als wenn jemand die Registry vollmüllt.

turboPASCAL 2. Mai 2009 15:13

Re: Speichern von Dateien - Windows Vista
 
Speicher deine Daten und Dateien da hin wo sie auch hin gehören.

Sichwort Hier im Forum suchenAppData bzw.: In .ini ohne Adminrechte speichern?

Ist also recht einfach:

Delphi-Quellcode:
unit Dingsbums;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, IniFiles, StdCtrls;

type
  TFormX = class(TForm)
    ButtonX: TButton;
    LabelX: TLabel;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
    procedure SaveIniFile;
  public
    { Public-Deklarationen }
  end;

var
  FormX: TFormX;

implementation

{$R *.dfm}

uses
  ShellAPi,
  ShlObj;

const
  strAppDataDir = '\tP.Software\My Testprogramm\';
  strIniFName  = 'TestIniFile.ini';

function GetShellFolder(CSIDL: integer): string;
var
  pidl: PItemIdList;
  FolderPath: string;
  SystemFolder: Integer;
begin
  FolderPath := '';
  SystemFolder := CSIDL;
  if SUCCEEDED(SHGetSpecialFolderLocation(0, SystemFolder, pidl)) then
  begin
    SetLength(FolderPath, MAX_PATH);
    SHGetPathFromIDList(pidl, PChar(FolderPath));
    SetLength(FolderPath, lstrlen(PChar(FolderPath)));
  end;
  Result := FolderPath;
end;

procedure TFormX.SaveIniFile;
var
  IniFile: TIniFile;
  AppDataDir: string;
begin
  AppDataDir := GetShellFolder(CSIDL_APPDATA) + strAppDataDir;

  if not DirectoryExists(AppDataDir) then
  begin
    if not ForceDirectories(AppDataDir) then
    begin
      ShowMessage('Fehler beim erstellen des Ordners: +'#13'"' + AppDataDir + '"');
      exit;
    end;
  end;

  LabelX.Caption := format('"%s"', [AppDataDir + strIniFName]);

  IniFile := TIniFile.Create(AppDataDir + strIniFName);
  try
    IniFile.WriteString('MyText', 'Infotext', 'Hallo');
  finally
    IniFile.Free;
  end;
end;

procedure TFormX.Button1Click(Sender: TObject);
begin
  SaveIniFile;
end;

end.

// Edit: also ebend war noch kein Beitrag ausser dem ersten da... ich werd wohl alt

himitsu 2. Mai 2009 15:28

Re: Speichern von Dateien - Windows Vista
 
sollte man nicht noch die pidl wieder freigeben? (mit CoTaskMemFree)
Delphi-Quellcode:
function GetShellFolder(CSIDL: integer): string;
var
  pidl: PItemIdList;
  SystemFolder: Integer;
begin
  SystemFolder := CSIDL;
  if SUCCEEDED(SHGetSpecialFolderLocation(0, SystemFolder, pidl)) then
  begin
    SetLength(Result, MAX_PATH);
    SHGetPathFromIDList(pidl, PChar(Result));
    SetLength(Result, lstrlen(PChar(Result)));
    CoTaskMemFree(pidl);
  end else Result := '';
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:26 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz