AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Tutorials Neuer Artikel bei mir: %HOMEDIR% - das unbekannte Verzeichni
Tutorial durchsuchen
Ansicht
Themen-Optionen

Neuer Artikel bei mir: %HOMEDIR% - das unbekannte Verzeichni

Ein Tutorial von Luckie · begonnen am 22. Sep 2005 · letzter Beitrag vom 1. Jan 2007
Antwort Antwort
Seite 7 von 9   « Erste     567 89      
Benutzerbild von Luckie
Luckie
Registriert seit: 29. Mai 2002
Es gibt auf meiner Homepage wieder einen neuen Artikel: %HOMEDIR% - das unbekannte Verzeichnis. Da er ein programmierspezifisches Thema behandelt, stelle ich ihn mal hier vor. In dem Artikel geht es um die Unsitte, dass Programmierer leider immer noch ihre Konfiguratiosndaten im Programmverzeichnis abelegen. In der letzten Zeit ist mir das immer wieder bei Programmen aufgefallen, die hier oder in anderen Foren vorgstellt werden. Da ich es leid war immer wieder das gleiche zu schreiben, hab eich mir erlaubt einen Artikel zuschreiben und es dort noch etwas weiter auszuführen.

Link zum Artikel: http://www.michael-puff.de/Developer.../HOMEDIR.shtml

Über Kritik und Anregungen würde ich mich freuen.
Ein Teil meines Codes würde euch verunsichern.
 
Benutzerbild von sakura
sakura

 
Delphi 11 Alexandria
 
#61
  Alt 28. Sep 2005, 08:02
Zitat von leddl:
Darf ich mal kurz anmerken, daß das DP-eigene SwapIt! ebenfalls versucht, das Ergebnis im Programmverzeichnis zu speichern? Zudem legt es genau das Verhalten an den Tag, das Luckie bemängelt hat und läßt sich nur über den Taskmanagager abschießen, wenn man keine Schreibrechte hat Soviel nochmal dazu
Nun ja Nichts ist perfekt, oder

......
Daniel W.
  Mit Zitat antworten Zitat
Benutzerbild von mschaefer
mschaefer

 
Delphi XE3 Enterprise
 
#62
  Alt 28. Sep 2005, 09:11
Moin, moin,

das kann man nur mit einem Lächeln kommentieren:

Wer auf dem eigenen Rechner mit SwapIT keine Schreibrechte hat, der sollte sich mal gedanken darüber machen,
über was er überhaupt noch etwas zu sagen hat. Ja, für die Kandiaten gilt: Schweigen ist Gold.

// Martin
Martin Schaefer
  Mit Zitat antworten Zitat
Benutzerbild von leddl
leddl

 
Delphi 2006 Professional
 
#63
  Alt 28. Sep 2005, 09:21
Zitat von mschaefer:
Moin, moin,

das kann man nur mit einem Lächeln kommentieren:

Wer auf dem eigenen Rechner mit SwapIT keine Schreibrechte hat, der sollte sich mal gedanken darüber machen,
über was er überhaupt noch etwas zu sagen hat. Ja, für die Kandiaten gilt: Schweigen ist Gold.

// Martin
Muß man das kommentieren? Wurde bereits alles diskutiert. Und schließlich muß es sich auch nicht immer um den eigenen Rechner handeln
Axel Sefranek
  Mit Zitat antworten Zitat
Benutzerbild von Jens Schumann
Jens Schumann

 
Delphi 2009 Professional
 
#64
  Alt 28. Sep 2005, 09:27
Hallo Luckie,
über diese Diskussion bin ich hier hergekommen.
Bei der function GetShellFolder ist mir folgendes aufgefallen:
Delphi-Quellcode:
function GetShellFolder(CSIDL: integer): string;
var
  pidl : PItemIdList;
  FolderPath : string;
  SystemFolder : Integer;
begin
  SystemFolder := CSIDL;
  if SUCCEEDED(SHGetSpecialFolderLocation(0, SystemFolder, pidl)) then
  begin
    SetLength(FolderPath, max_path);
    if SHGetPathFromIDList(pidl, PChar(FolderPath)) then
    begin
      SetLength(FolderPath, length(PChar(FolderPath)));
    end;
  end;
  Result := FolderPath; // <- Welchen Wert hat FolderPath wenn
                        // SUCCEEDED einen Fehler zurückgibt ???

  // Hier wird pidl nicht freigeben -> Funktion erzeugt Speicherleck

end;
Zitat von MSDN:
ppidl
[out] A pointer to an item identifier list (PIDL) specifying the folder's location relative to the root of the namespace (the desktop). The calling application is responsible for freeing this pointer with the Shell's IMalloc interface (see SHGetMalloc).
Etwas besser wäre es so:
Delphi-Quellcode:
function GetShellFolder(CSIDL: integer): string;
var
  pidl : PItemIdList;
  FolderPath : string;
  SystemFolder : Integer;
  Malloc : IMalloc; // Interface für IMalloc
begin
  Malloc:=Nil;
  FolderPath:=''; // Initialisieren damit Result immer definiert ist
  SHGetMalloc(Malloc); // Interface holen damit am Ende pidl freigegeben werden kann
  If Malloc=Nil then
    begin
    Result:=FolderPath;
    Exit;
    end;
  Try
    SystemFolder := CSIDL;
    if SUCCEEDED(SHGetSpecialFolderLocation(0, SystemFolder, pidl)) then
    begin
      SetLength(FolderPath, max_path);
      if SHGetPathFromIDList(pidl, PChar(FolderPath)) then
      begin
        SetLength(FolderPath, length(PChar(FolderPath)));
      end;
    end;
    Result := FolderPath;
  Finally
    Malloc.Free(pidl); // Speicher freigeben
    end;
end;
Ich schreibe Artikel oder Tutorials wenn 100%tig weiss was ich schreibe. Deshalb habe ich noch nie einen Artikel oder ein Tutorial geschrieben.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

 
Delphi 2006 Professional
 
#65
  Alt 28. Sep 2005, 10:46
Oh besten Dank, ist mir irgendwie immer entgangen.
Michael
  Mit Zitat antworten Zitat
Thanatos81
 
#66
  Alt 4. Nov 2005, 23:45
Hi Luckie,

hab gerade ein kleines Tool geschrieben und konnte deine Funktion dabei gut gebrauchen. Beim erneuten Lesen deines Artikels ist mir ein Verbesserungsvorschlag gekommen, verlinke doch auf die MSDN und zwar auf "Shell Constants, Enumerations, and Flags".

Da findet der Leser gleich eine Liste der CSIDLs und kann sich die raussuchen die er benötigt.

Schönen Gruß,
  Mit Zitat antworten Zitat
Nicolai1234

 
Turbo Delphi für Win32
 
#67
  Alt 16. Aug 2006, 00:34
@Luckie
Jetzt wollte ich mal einen deiner Artikel verlinken (hier) und dann ist der einfach weg
Bei den anderen Artikeln auf deiner Seite hat sich ja das Design ein bisschen verändert, aber diesen hier kann ich nirgends mehr finden.
Wäre schön, wenn du den wieder herstellen könntest
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

 
Delphi 2006 Professional
 
#68
  Alt 16. Aug 2006, 08:58
Da ist er doch: http://www.michael-puff.de/Developer.../HOMEDIR.shtml
Michael
  Mit Zitat antworten Zitat
Go2EITS

 
Delphi 7 Personal
 
#69
  Alt 14. Sep 2006, 19:14
Ich hätte zwei Vorschläge zu:
http://www.michael-puff.de/Developer.../HOMEDIR.shtml

a) ein Aufrufbeispiel wäre schön
und
b) die Konstantenliste und die Pfade, die man dazu bekommt.

Hier die KonstantenListe:
Delphi-Quellcode:
  CSIDL_DESKTOP = $0000;
  CSIDL_INTERNET = $0001;
  CSIDL_PROGRAMS = $0002;
  CSIDL_CONTROLS = $0003;
  CSIDL_PRINTERS = $0004;
  CSIDL_PERSONAL = $0005;
  CSIDL_FAVORITES = $0006;
  CSIDL_STARTUP = $0007;
  CSIDL_RECENT = $0008;
  CSIDL_SENDTO = $0009;
  CSIDL_BITBUCKET = $000a;
  CSIDL_STARTMENU = $000b;
  CSIDL_DESKTOPDIRECTORY = $0010;
  CSIDL_DRIVES = $0011;
  CSIDL_NETWORK = $0012;
  CSIDL_NETHOOD = $0013;
  CSIDL_FONTS = $0014;
  CSIDL_TEMPLATES = $0015;
  CSIDL_COMMON_STARTMENU = $0016;
  CSIDL_COMMON_PROGRAMS = $0017;
  CSIDL_COMMON_STARTUP = $0018;
  CSIDL_COMMON_DESKTOPDIRECTORY = $0019;
  CSIDL_APPDATA = $001a;
  CSIDL_PRINTHOOD = $001b;
  CSIDL_ALTSTARTUP = $001d; // DBCS
  CSIDL_COMMON_ALTSTARTUP = $001e; // DBCS
  CSIDL_COMMON_FAVORITES = $001f;
  CSIDL_INTERNET_CACHE = $0020;
  CSIDL_COOKIES = $0021;
  CSIDL_HISTORY = $0022;
Zugegeben: Eigentlich sind die Bezeichnungen schon aussagekräftig genug.

Damit erübrigen sich dann einige Fragen in der DP sehr schnell.
Mit besten Grüßen
Go2EITS
  Mit Zitat antworten Zitat
Benutzerbild von negaH
negaH
 
#70
  Alt 14. Sep 2006, 20:12
Zitat:
Nun, Martin redet von Programmen, die sich ausschließlich in ihrem eigenen Ordner abspielen und da muss ich auch sagen, dass dies absolut praktisch ist. Es gibt nur ein Verzeichnis, welches es bei Bedarf zu packen/löschen/verschieben/kopieren gilt.

Beide Positionen haben etwas für sich - aus pragmatischer Sicht sehe ich dies ebenso wie Martin.
Dem kann ich nur zustimmen. Viel schlimmer noch:

1.) was wenn die Software selber die Benutzer verwalten muß und dazu in einer einzigsten Datei deren Passwörter etc. abspeichern möchte. Diese Datei kann man nicht für jeden Benutzer duplizieren da die Software Zugriff auf diese Einstelungen für alle Benutzer gmeinesam haben muß

2.) was ist wenn man die Software in einem Netzwerk installiert, aus administrativen Gründen der Fernwartung

3.) was ist wenn man die Software durch kopieren des Ordners packen, installieren, backupen will ? Muß man sich dann diese Benutzereinstelungen alle wieder verteilt auf den Rechnern zusammensuchen ?

4.) was ist wenn die Software Benutzerabhängig aber Computer-Unabhngig in einer Netzwerkinstalation arbeiten soll ? Dh. egal an welchem Rechner sich der Benutzer anmeldet wer findet immer seine individuellen Einstellungen vor.

5.) was ist wenn diese Konfigurationsdaten durch die eigene Sofware verändert werden müssen, aber Benutzer-Unabhängig weil es keine Benutzerdaten sind sondern global gültige Einstellungen ?

Ja, man könnte jetzt sagen dann installiere deine Netzwerk-Domäne richtig, was dann zwangsläufig einen Windows Server vorraussetzt. Funktioniert bei einfachen Netzwerken als Fileserver eben nicht mehr. Und wir haben wiederum das Problem das die Benutzereinstellungen auf dem Lokalen Computer gespeichert werden.

Ich preferiere immer noch das Speichern der Daten relativ zum Programpfad, wenn die Software eine eigene Userverwaltung benutzt oder eben gobale für alle Benutzer gültige Einstellungen speichern möchte.

Gruß Hagen
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 7 von 9   « Erste     567 89      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:20 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