Autor Beitrag
Jens Hartmann
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 120

XP
Delphi
BeitragVerfasst: Fr 23.01.09 17:55 
Hallo zusammen,

Ich habe mal eine kleine Frage zum schreiben von Dateien. Ich habe für meine Software ein Programm geschrieben, mit der ich für jeden Kunden eine Lizenzdatei und Kundendatendatei erstelle. Diese beiden Dateien werden bei Auslieferung von meinem Programm mitgeliefert und durch die Software abgefragt. Daher habe ich in meiner Software einmal realisiert, das sie Lizenziert ist und außerdem die Kundenspezifischen Daten in die Registry geschrieben werden.

Damit ich jetzt alle Kundendaten sauber sortiert Speichern kann, wird beim Erstellen ein Matchcode als Dateiname zugefügt.
Wie kann ich es jetzt realiseren, die Daten auf gleicher Eben wie der Prgrammordner abzuspeichern.

Was heißt, das ich meinen Programmordner nochmal unterteil habe in die Ordener Prg, DB und Liz.
z.B.

C:\Programme\LizMaker\Prg\Lizmaker.exe
C:\Programme\LizMaker\DB\Kunden.mdb
C:\Programme\LizMaker\Liz\H\Hartmann Jens.liz
C:\Programme\LizMaker\Liz\H\Daten Hartmann Jens.ini

Um das schreiben in den Programmordener zu realisieren, nutze ich momentan
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
  Kundendaten := TIniFile.Create('.\Liz\'+Matchcode+' Kundendaten.Ini');
  with Kundendaten do begin
    WriteString('Kunde', 'Kunde', Kundenname);
    WriteString('Kunde', 'Objekt', Objekt+#13#10);
    WriteString('Standort', 'Anschrift', Straße+' '+Hausnummer);
    WriteString('Standort', 'Wohnort', PLZ+' '+Ort+#13#10);
    WriteString('Kontakt', 'Tel', Tel);
    WriteString('Kontakt', 'Fax', Fax);
    WriteString('Kontakt', 'E-Mail', EMail+#13#10);
    WriteString('Software', 'Version', Version);
    WriteString('Software', 'Seriennummer', Seriennummer);
    WriteString('Software', 'Lizenznummer', Lizenznummer);
  end;
  Kundendaten.Free;


Jetzt ist halt die Frage wie bekomme ich die Datei einen Ordner höher und dann nach LIZ\H oder so.

MFG

Jens :nixweiss:
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Fr 23.01.09 18:17 
Das funktioniert so aber nicht immer, ohne absoluten Pfad ist das ein Glücksspiel:
www.delphi-library.d...ewtopic.php?p=499701

Und zu deinem Problem gibt es hier einen Beitrag:
www.delphi-library.d...ewtopic.php?p=166588
oder eine einfache Funktion:
msdn.microsoft.com/e...ibrary/bb773571.aspx
Jens Hartmann Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 120

XP
Delphi
BeitragVerfasst: Mo 26.01.09 20:52 
Danke,

Hat alles wunderbar funktionoiert. Habe mein Datei jetzt da wo ich Sie brauche!

MFG

Jens :zustimm:
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Di 27.01.09 03:49 
Wobei Benutzerkonfigurationen und andere Daten, die nach der Installation angelegt werden, NICHT IN DAS PROGRAMMVERZEICHNIS gehören! Punkt.

Spätestens unter Windows XP, garantiert aber mit Vista, fliegt dir das um die Ohren!

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: Di 27.01.09 07:25 
user profile iconBenBE hat folgendes geschrieben Zum zitierten Posting springen:
garantiert aber mit Vista, fliegt dir das um die Ohren!

Nicht unbedingt ;) Denn Vista hat einen Kompatibilitätsmodus, wo der Programmordner ggf. umgeleitet wird. (Nicht, dass ich das empfehle!)
Jens Hartmann Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 120

XP
Delphi
BeitragVerfasst: Di 27.01.09 13:36 
Das mit dem Windows Vista und so, ist mir schon des öfteren hier aufgefallen,

Bei dem Programm hier, ist das egal, weil ich das auf meinem XP-Rechner habe und es nur zum Lizenzdateiem ertstellen nutzte.

Aber trotzallem, ich will mich ja belehren lassen, wie und wo speichert man denn dann heute Lizenzdaten und Eigenschaften von Programmen ?

MFG

Jens
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 27.01.09 14:00 
Das gehört in den Ordner Anwendungsdaten, zu finden z.B. mit SHGetFolderPath und CSIDL_APPDATA bzw. CSIDL_COMMON_APPDATA.

[edit] Natürlich in einen anzulegenden Unterordner davon ;) [/edit]


Zuletzt bearbeitet von DeddyH am Di 27.01.09 14:06, insgesamt 1-mal bearbeitet
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 27.01.09 14:03 
Man legt einen Unterordner für sein Programm in dem Ordner an der durch SHGetSpecialFolderLocation mit der ID CSIDL_APPDATA zurückgegeben wird:
Zitat:
CSIDL_APPDATA (FOLDERID_RoamingAppData): The file system directory that serves as a common repository for application-specific data.

Oder wenn es nicht benutzer spezifisch ist:
Zitat:
CSIDL_COMMON_APPDATA (FOLDERID_ProgramData)
Version 5.0. The file system directory that contains application data for all users. A typical path is C:\Documents and Settings\All Users\Application Data. This folder is used for application data that is not user specific. For example, an application can store a spell-check dictionary, a database of clip art, or a log file in the CSIDL_COMMON_APPDATA folder. This information will not roam and is available to anyone using the computer.
Jens Hartmann Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 120

XP
Delphi
BeitragVerfasst: Di 27.01.09 15:10 
In welchem Unit sind den diese Möglichkeiten gegeben, oder wie erreiche ich es den Pfad abzufragen.

Habe jetzt mal ein bißchen probiert, aber leider ohne Erfolg.

Hat vieleicht jemand mal ein Beispiel (nicht die Lösung in Delphi), sondern nur wie das Verzeichnis und der Aufbau auszusehen hat.

Ich will das schon gerne selber lösen.

MFG

Jens
Nersgatt
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1581
Erhaltene Danke: 279


Delphi 10 Seattle Prof.
BeitragVerfasst: Di 27.01.09 15:15 
Bei mir sieht das so aus:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
uses ShlObj [...]

Function GetSpecialFolder (aFolder: Integer): String;
var
  pIdL: PItemIDList;
  Path: Array [0..Max_Path] Of Char;
  Allocator: IMalloc;
Begin
  // ItemIdList für den Ordner holen
  SHGetSpecialFolderLocation (0, aFolder, pIdL);

  // ItemIdList in String umwandeln lassen
  SHGetPathFromIDList (pIDL, Path);

  // Speicher wieder freigeben
  If Succeeded (SHGetMalloc (Allocator)) Then
    Begin
      Allocator.Free (pIdL);
      {$IFDEF VER100}
      Allocator.Release;
      {$ENDIF}
    End;

  Result := Path;
End;


Aufruf z.B. so:
ausblenden Delphi-Quelltext
1:
result := GetSpecialFolder(CSIDL_COMMON_APPDATA);					

_________________
Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 27.01.09 16:09 
user profile iconJens Hartmann hat folgendes geschrieben Zum zitierten Posting springen:
Hat vieleicht jemand mal ein Beispiel (nicht die Lösung in Delphi), sondern nur wie das Verzeichnis und der Aufbau auszusehen hat.
Ich hab dir ganz oben schon den Link inkl. Demo gepostet, du hättest nur etwas herunterscrollen müssen...
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Das funktioniert so aber nicht immer, ohne absoluten Pfad ist das ein Glücksspiel:
www.delphi-library.d...ewtopic.php?p=499701
Der zweite Teil widmet sich nämlich dem Problem, und das steht auch schon ganz oben in dem Link...
www.delphi-library.d....php?p=541636#541636
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Mehr dazu (fehlende Schreibrechte im Verzeichnis des eigenen Programms) unten im zweiten Teil:
Jens Hartmann Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 120

XP
Delphi
BeitragVerfasst: Mi 28.01.09 18:40 
Hallo Sebastian,

Sorry erstmal, das ich deinen Beitrag oben nicht genau gelesen habe.
Erstmal muss ich Dir ein ganz großes Lob aussprechen, da der Beitrag zwar kurz, aber dafür vollkommend ausreichend und verständlich ist.

Jetzt habe ich allerdings noch zwei fragen.

1: Ich nutze für mein Programm eine Lizenzdatei, aus der ich nur die Lizenzinformationen entnehme. Wenn ich das alles richtig verstanden habe, kann diese aber im Programmverzeichnis liegen, da ich dort nur Daten lese und somit ja keine Schreibrechte benötige.

2. Außerdem benutzt ich eine INI-Datei für meine User-Einstellungen, die allerdings bei allen Usern gleich sein soll, da es Programmeinstellungen sind, in der gewisse Funktionen gespeichert werden.

Meine Lösung dazu wäre, diese in

In der Registry unter HKEY_LOCAL_MACHINE\Software\Hersteller\Softwarename\Version (Also nicht mehr INIDatei)
oder
C:\Dokumente und Einstellungen\All Users\Anwendungsdaten (Weiterhin INI Datei)

zu speichern.

Bin ich auf dem richtigen Weg, oder soll ich das ganze anders angehen.

MFG

Jens
Jens Hartmann Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 120

XP
Delphi
BeitragVerfasst: Mi 28.01.09 18:50 
Hab jetzt z.B. das ganz mal in mein Programm integriert und da kommt bei folgendem Quelltext,
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
Function GetSpecialFolder (aFolder: Integer): String;
var
  pIdL: PItemIDList;
  Path: Array [0..Max_Path] Of Char;
  Allocator: IMalloc;
Begin
  // ItemIdList für den Ordner holen
  SHGetSpecialFolderLocation (0, aFolder, pIdL);

  // ItemIdList in String umwandeln lassen
  SHGetPathFromIDList (pIDL, Path);

  // Speicher wieder freigeben
  If Succeeded (SHGetMalloc (Allocator)) Then
    Begin
      Allocator.Free (pIdL);
      {$IFDEF VER100}
      Allocator.Release;
      {$ENDIF}
    End;
  Speicherort := Path;
  Result := Path;
End;

procedure TForm1.Button1Click(Sender: TObject);
begin
  GetSpecialFolder(0);
  Memo.Text := Speicherort;
end;


folgender Rückgabewert raus...

[highlight]
C:\Dokumente und Einstellungen\user\Desktop[/highlight]

Ich persönlich finde diesen Rückgabewert, jetzt sehr seltsam. wie komme ich denn auf den richtigen Pfad.

MFG

Jens
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Mi 28.01.09 18:54 
Du musst bei GetSpecialFolder die korrekte ID übergeben.

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 28.01.09 18:55 
Verwende statt der 0 die vordefinierten CSIDL_*-Konstanten. Für die Anwendungsdaten sind das wie erwähnt CSIDL_APPDATA bzw. CSIDL_COMMON_APPDATA.
Jens Hartmann Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 120

XP
Delphi
BeitragVerfasst: Mi 28.01.09 19:05 
Danke zusammen, Funktioniert so.

Sorry, aber mein Problem ist dabei im das ENGLISCH.

Wie sieht es aus mit meiner Lzenzdatei. Ist das so in Ordnung.

Habe das jetzt alles soweit hinbekommen und speicher meine Daten jetzt unter

C:\Dokumente und Einstellungen\All Users\Anwendungsdaten

Jetzt habe ich nur ein Problem, und das habe ich noch nie verstanden. Warum finde ich diese INI datei nicht in dem Verzeichnis.
Aber mein Programm nutzt diese.

Den Ordner Anwendungsdaten sehe ich gar nicht.

Bin ich doof oder so.

MFG

Jens
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 28.01.09 19:41 
user profile iconJens Hartmann hat folgendes geschrieben Zum zitierten Posting springen:
Wie sieht es aus mit meiner Lzenzdatei. Ist das so in Ordnung.
Ja, sicher, alles was nur zum Lesen ist, das kann ruhig im Ordner der Anwendung mitgeliefert werden. Es ist aber auch nicht falsch das ebenfalls in die Anwendungsdaten zu legen.

Viele Programme legen dort auch solche Daten ab um sie nach einem Update vielleicht doch einmal verändern zu können o.ä. ;-)

user profile iconJens Hartmann hat folgendes geschrieben Zum zitierten Posting springen:
Jetzt habe ich nur ein Problem, und das habe ich noch nie verstanden. Warum finde ich diese INI datei nicht in dem Verzeichnis.
Du solltest dort in den Anwendungsdaten noch einen Unterordner anlegen, damit man weiß zu welchem Programm die Datei gehört. Typisch wäre zuerst dein Name oder der Firmenname und noch ein Unterordner mit dem Produktnamen. So habe ich das ja auch gemacht, und mit ForceDirectories sichergestellt, dass dieses Verzeichnis auch existiert.

user profile iconJens Hartmann hat folgendes geschrieben Zum zitierten Posting springen:
Den Ordner Anwendungsdaten sehe ich gar nicht.
Windows Explorer --> Ordneroptionen --> Ansicht...
Dort gibt es dann "Geschützte Systemdateien ausblenden" und unter "Versteckte Dateien und Ordner" --> "Alle Dateien und Ordner anzeigen".

Nur mit diesen Einstellungen siehst du wirklich alles. Auf einem PC zur Softwareentwicklung ist es durchaus ratsam zumindest versteckte Dateien einzublenden. ;-)
Jens Hartmann Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 120

XP
Delphi
BeitragVerfasst: Mi 28.01.09 21:08 
Ich danke Euch allen für die super geiler Hilfe.

MFG

Jens