Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Nichtvirtualisierter Ordner auf Win7? (https://www.delphipraxis.net/162907-nichtvirtualisierter-ordner-auf-win7.html)

frieder2008 9. Sep 2011 09:05

Nichtvirtualisierter Ordner auf Win7?
 
Moin zusammen,

ich habe jetzt eine geschlagene Stunde gesucht, aber nichts geeignetes gefunden: In meinem Programm wird im Programmverzeinis (extract..paramstr(0)) ein temp-Ordner erstellt, in dem Daten abgelegt und aufgerufen werden.

Unter Win XP nie ein Problem gewesen. Unter Win7 (64) auch kein Problem, sofern das Programm nicht in einem der Systemverzeichnisse (system/programme usw.) liegt. Wird das Programm aber im App-Verzeichnis (C:\Program Files (x86)) installiert, wird der temp-Ordner automatisch im VirtualStore gespeichert. Um damit verbundene Probleme einfach zu umgehen, suche ich einen (windows-versionen-übergreifenden) Ordner, in dem ich mein temp anlegen könnte. Ich habe es dann auch mit dem Windows-temp-Verzeichnis (ermittelt aus den Umgebungsvariablen) versucht, aber das klappt nicht (directoryexists macht dann schon Probleme).

Hat jemand eine Idee
a) wie ich den VirtualStore über mein Programm deaktivieren oder
b) für einen virtualstore-unabhängigen, aber systemübergreifenden Ordner?

Danke und schöne Grüße aus dem Süden,
Frieder

Bernhard Geyer 9. Sep 2011 09:21

AW: Nichtvirtualisierter Ordner auf Win7?
 
Zitat:

Zitat von frieder2008 (Beitrag 1122839)
a) wie ich den VirtualStore über mein Programm deaktivieren oder

Dein Programm braucht ein entsprechendes Manifest. Neue Delphi-Versionen fügen diese automatisch hinzu. Für alte Delphi-Versionen muss man diese selbst hinzufügen.

Zitat:

Zitat von frieder2008 (Beitrag 1122839)
b) für einen virtualstore-unabhängigen, aber systemübergreifenden Ordner?

Wie wäre es mit dem Windows-Temp-Ordner?

frieder2008 9. Sep 2011 09:33

AW: Nichtvirtualisierter Ordner auf Win7?
 
Hallo Bernhard,

danke für Deine Antwort:
- Problem 1 (D5): "Manifest": - Gibt es hierzu ein Tutorial? Ich habe bislang keine Ahnung von den Parametern, welche wie sein müssen, damit das Programm automatisch alle Zugriffsrechte hat. Von himitsu habe ich folgendes gefunden, aber kann eben nicht beurteilen, ob das schon reicht:

http://www.delphipraxis.net/771563-post4.html

- Problem 2: Windows-temp-Verzeichnis habe ich versucht: Habe das Verzeichnis ermittelt und prüfe, ob bereits ein "meintemp" da ist (beim Starten von mehreren Instanzen des eigenen Progs). Leider produziert directoryexists (D5) immer true, obwohl def. kein Temp-Verzeichnis da ist:

Delphi-Quellcode:
function GetTempDir: string;
var
  Dir: string;
  Len: DWord;
begin
  SetLength(Dir,MAX_PATH);
  Len:=GetTempPath(PChar(Dir),MAX_PATH);
  if Len>0 then
  begin
    SetLength(Dir,Len);
    Result:=Dir;
  end
  else
    RaiseLastOSError;
end;

while DirectoryExists(pchar(tempdirstr + '\meintemp' + inttostr(i))) do
  inc(i); //--> Endlosschleife..
CreateDir(tempdirstr + '\meintemp' + inttostr(i));
Woran kann das liegen?

Danke und Gruß,
frieder

Union 9. Sep 2011 09:39

AW: Nichtvirtualisierter Ordner auf Win7?
 
Zitat:

Zitat von Bernhard Geyer (Beitrag 1122842)
Wie wäre es mit dem Windows-Temp-Ordner?

Da hatte er ja geschrieben dass es nicht funktioniert.

Im allgemeinen finde ich aber den ganzen Ansatz falsch. Man programmiert für Windows und sollte sich an die Konventionen halten. Also eben NICHT Exename oder paramstr Gefrickel, sondern SHGetSpecialFolder.

himitsu 9. Sep 2011 09:43

AW: Nichtvirtualisierter Ordner auf Win7?
 
Du, bzw. dein Programm hast im Programmeverzeichnis (Zurecht) keine Schreibrechte mehr, als "normaler" Benutzer.

PS: Das war schon unter XP so, wenn man nur nicht ständig mit vollen Adminrechten arbeiten und so diese Sperren umgehen würde. :zwinker:


Das Manifest im XE ist aber nur ein GUI-Manifest, für die neuen Commoncontrols.
Der VirtualStore (Kompatibilität mit Win7 und/oder Vista) oder die Benutzerrechte werden damit nicht geregelt.

Infos zu Manifesten (vorallem das sogenannte Admin-Manifest) gibt es zu genüge in der DP zu finden.
oder unter Hier im Forum suchenManifest-Creator, wo auch ein paar Infos/Hintergründe genannt werden.


Es bleibt aber zu empfehlen, daß du dich an den vordefinierten Temp-Ordner wendest.
Im Notfall könnte man sich auch (temporär) ein Unterverzeichnis darin erstellen.

Luckie 9. Sep 2011 09:45

AW: Nichtvirtualisierter Ordner auf Win7?
 
Zitat:

Zitat von frieder2008 (Beitrag 1122839)
Unter Win XP nie ein Problem gewesen.

Klar, weil du immer als Administrator gearbeitet hast. bei mir würde dein Programm nicht funktionieren, weil es keine Schreibrechte im Programmeordner hätte, da ich nur als normaler Benutzer an meinem Rechner arbeite.

Zitat:

Unter Win7 (64) auch kein Problem, sofern das Programm nicht in einem der Systemverzeichnisse (system/programme usw.) liegt.
Weil du da auch keine Schreibrechte hast. Selbst wenn du als Administrator unter Vista und höher angemeldet bist, hast du erst mal nur eingeschränkte Rechte, es sei denn dein Programm hat ein Manifest, welches höhere rechte anfordert, dann poppt die UAC auf.

Zitat:

Wird das Programm aber im App-Verzeichnis (C:\Program Files (x86)) installiert, wird der temp-Ordner automatisch im VirtualStore gespeichert.
Habe ich die Sache mit den Rechten schon erwähnt? ;) Damit auch alte Programme laufen, die es "gewöhnt" waren als Administrator ausgeführt zu werden (Standardkonto bei XP), hat Microsoft die Virtualisierung entwickelt, welche solche Schreibzugriffe einfach umbiegt.

Zitat:

Um damit verbundene Probleme einfach zu umgehen, suche ich einen (windows-versionen-übergreifenden) Ordner, in dem ich mein temp anlegen könnte. Ich habe es dann auch mit dem Windows-temp-Verzeichnis (ermittelt aus den Umgebungsvariablen) versucht, aber das klappt nicht (directoryexists macht dann schon Probleme).
Benutze das Temporäreverzeichnis, dafür ist es da. Und so kannst du den Pfad ermitteln:
Delphi-Quellcode:
function GetTempDir(): string;
var
  Size: DWORD;
  Len: DWORD;
begin
  Size := MAX_PATH;
  SetLength(Result, Size);
  Len := GetTempPath(Size, PChar(Result));
  if Len > 0 then
    SetLength(Result, Len)
  else
    raise Exception.Create(SysErrorMessage(GetLastError));
end;
Ich glaube, dein Problem ist nicht die Ermittlung des Temporärenverzeichnisses, sondern das was du danach machst in der Schleife. Lass dir mal die Zeichenkette anzeigen (Zwischenspeichern in einer Variable) und guckt, was du dir da zusammenbastelst.

Bernhard Geyer 9. Sep 2011 09:57

AW: Nichtvirtualisierter Ordner auf Win7?
 
Zitat:

Zitat von Union (Beitrag 1122851)
Zitat:

Zitat von Bernhard Geyer (Beitrag 1122842)
Wie wäre es mit dem Windows-Temp-Ordner?

Da hatte er ja geschrieben dass es nicht funktioniert.

Im allgemeinen finde ich aber den ganzen Ansatz falsch. Man programmiert für Windows und sollte sich an die Konventionen halten. Also eben NICHT Exename oder paramstr Gefrickel, sondern SHGetSpecialFolder.

Ich mein doch den Ordern den Windows dafür vorsieht. Der name SHGetSpecialFolder war mir gerade entfallen.

DeddyH 9. Sep 2011 10:11

AW: Nichtvirtualisierter Ordner auf Win7?
 
IIRC lässt sich mit SHGetSpecialFolder aber nicht der TEMP-Ordner ermitteln, da es dafür keine CSIDL gibt. Aber GetTempPath sollte das gewünschte Ergebnis bringen wie oben gezeigt.

frieder2008 9. Sep 2011 10:13

AW: Nichtvirtualisierter Ordner auf Win7?
 
Also zunächst mal danke für die Antworten.. Man lernt nie aus :oops:

Wenn ich richtig sehe, ist das einfachste, das Windows-temp-Verzeichnis einzubinden. Das wollte ich ja auch...

Zitat:

Ich glaube, dein Problem ist nicht die Ermittlung des Temporärenverzeichnisses, sondern das was du danach machst in der Schleife. Lass dir mal die Zeichenkette anzeigen (Zwischenspeichern in einer Variable) und guckt, was du dir da zusammenbastelst.
Das Windows-Temp-Verzeichnis (via gettemppath) wird korrekt ermittelt. Ich verstehe nicht, warum existdirectory fälschlicherweise "true" zurückgibt?!?

Und noch eine andere Frage: Ich lasse im Setup auch andere *exe in das App-Verzeichnis installieren, auf das dann das Hauptprogramm via shellexec.. zugreift. Funktioniert der Zugriff dann ohne Admin-Rechte auch nicht mehr?!? :gruebel:

Danke und Gruß,
frieder

DeddyH 9. Sep 2011 10:15

AW: Nichtvirtualisierter Ordner auf Win7?
 
Du meinst, ob sich die Programme starten lassen? Das sollte im Normalfall weiterhin möglich sein, solange Du nicht versuchst, in die Exen hineinzuschreiben :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:33 Uhr.
Seite 1 von 3  1 23      

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