AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi CSDIL_PROGRAM_FILES in 32Bit/64Bit
Thema durchsuchen
Ansicht
Themen-Optionen

CSDIL_PROGRAM_FILES in 32Bit/64Bit

Ein Thema von QuickAndDirty · begonnen am 7. Sep 2012 · letzter Beitrag vom 22. Sep 2012
Antwort Antwort
Benutzerbild von RWarnecke
RWarnecke

Registriert seit: 31. Dez 2004
Ort: Stuttgart
4.408 Beiträge
 
Delphi XE8 Enterprise
 
#1

AW: CSDIL_PROGRAM_FILES in 32Bit/64Bit

  Alt 7. Sep 2012, 19:39
Auf einem Windows 64Bit wird CSIDL_PROGRAM_FILES bei einem 32Bit-Programm C:\Program Files (x86) und ein 64Bit-Programm C:\Program Files als Ergebnis liefern.
Rolf Warnecke
App4Mission
  Mit Zitat antworten Zitat
hathor
(Gast)

n/a Beiträge
 
#2

AW: CSDIL_PROGRAM_FILES in 32Bit/64Bit

  Alt 8. Sep 2012, 09:04
"Wer nach Hunden sucht, wird keine Katzen finden."

Die Frage ist falsch gestellt:
Nimm KNOWNFOLDERID:
http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx
.
http://msdn.microsoft.com/en-us/wind.../gg463051.aspx
.
FOLDERID_ProgramFiles

GUID: {905e63b6-c1bf-494e-b29c-65b732d3d21a}
Display Name: Program Files
Folder Type: FIXED
Default Path: %ProgramFiles% (%SystemDrive%\Program Files)
CSIDL Equivalent: CSIDL_PROGRAM_FILES
Legacy Display Name: Program Files
Legacy Default Path: %ProgramFiles% (%SystemDrive%\Program Files)

Geändert von hathor ( 8. Sep 2012 um 09:17 Uhr)
  Mit Zitat antworten Zitat
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
2.007 Beiträge
 
Delphi 12 Athens
 
#3

AW: CSDIL_PROGRAM_FILES in 32Bit/64Bit

  Alt 8. Sep 2012, 10:17
Und wie bekomme ich damit Raus ob z.B.
'c:\Programski Fileski\MYProgramm'
ein Ort in einem SpecialFolder ist?

Ich muss verhindern das ein Setup etwas in das "Programme" Verzeichnis installiert, Weil unsere Anwendung dafür noch nicht ausgelegt ist.
Andreas
Monads? Wtf are Monads?
  Mit Zitat antworten Zitat
hathor
(Gast)

n/a Beiträge
 
#4

AW: CSDIL_PROGRAM_FILES in 32Bit/64Bit

  Alt 8. Sep 2012, 10:24
Das ist doch in den Links oben genau beschrieben:
Mit einem 32Bit-Programm bekommst Du auch NUR den 32Bit-Ordner! Siehe Anhang...

Ich würde von den WINDOWS-Programm-Pfaden "die Finger lassen".

Alternative - da ist es gleich, ob 32Bit oder 64Bit:

Delphi-Quellcode:
function SpecialDirectory(const iID: Integer): string;
var aPath : array[0..MAX_PATH] of Char; pilTemp: PItemIDList;
begin
   try
      if SHGetSpecialFolderLocation(0, iID, pilTemp)=S_OK then begin
         if SHGetPathFromIDList(pilTemp, aPath) then begin
            Result := string(aPath);
         end else Result := ''; CoTaskMemFree(pilTemp);
      end else Result := '';
   except Result := '';
   end;
end;

function GetConfigPath: String;
var AppDir: String;
begin
  AppDir := SpecialDirectory(CSIDL_APPDATA)+'\DEIN PROGRAMM-NAME'; //DEIN PROGRAMM-NAME
  if DirectoryExists(AppDir) = false then mkdir(AppDir);
    result := AppDir+'\';
end;
Angehängte Grafiken
Dateityp: jpg WINDOWS-PATHS.jpg (163,9 KB, 51x aufgerufen)

Geändert von hathor ( 8. Sep 2012 um 10:43 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#5

AW: CSDIL_PROGRAM_FILES in 32Bit/64Bit

  Alt 8. Sep 2012, 11:50
Warum nicht ParamStr(0) oder ist es nicht das eigene Programm?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
2.007 Beiträge
 
Delphi 12 Athens
 
#6

AW: CSDIL_PROGRAM_FILES in 32Bit/64Bit

  Alt 8. Sep 2012, 12:03
Warum nicht ParamStr(0) oder ist es nicht das eigene Programm?
Ich will eine Installation in den Programme Ordner verhindern.
Das Problem ist zu prüfen ob der angegebene Pfad der Programme Pfad ist.
Andreas
Monads? Wtf are Monads?
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.659 Beiträge
 
Delphi 12 Athens
 
#7

AW: CSDIL_PROGRAM_FILES in 32Bit/64Bit

  Alt 8. Sep 2012, 14:04
Ich will eine Installation in den Programme Ordner verhindern.
Bist Du Dir sicher, dass das der richtige Weg ist? Immerhin ist das ja der vorgesehene Installationsordner.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
2.007 Beiträge
 
Delphi 12 Athens
 
#8

AW: CSDIL_PROGRAM_FILES in 32Bit/64Bit

  Alt 8. Sep 2012, 11:56
Ich will nicht IN einen Specialfolder installieren.

Ich will verhindern das jemand einen Ordner angibt der ein Specialfolder ist. Insbesondere die WOW64 File System Redirection macht das recht schwer.

Ich habe jetzt folgende Lösung aus dem Guide den du Verlinkts hast zusammen gestrickt.


Delphi-Quellcode:
Function CheckForProgramFilesPath(aPath:String):Boolean;
var Ppath:String;
    i:integer;
  const PathVariable:Array[0..5] of string=(
                                            '%ProgramFiles%',
                                            '%ProgramFiles(x86)%',
                                            '%ProgramW6432%',
                                            '%CommonProgramFiles%',
                                            '%CommonProgramW6432%',
                                            '%CommonProgramFiles(x86)%'
                                           );

  function ExpandEnvStr(const szInput: string): string;
  var szBuf:String;
      r : Cardinal;
  begin
    result := '';
    try
      r := ExpandEnvironmentStrings(pChar(szInput), nil, 0);
      if r > 0 then
      Begin
        SetLength(szBuf, r);
        ExpandEnvironmentStrings(pChar(szInput), PChar(szBuf), r);
        result := PChar(szBuf);
      End;
    except
      Result := '';
    end;
  end;
{
  Function UnExpandEnvPath(const szPath: string):String;
  var szBuf:String;
      cchBuf:Cardinal;
  Begin
    setLength(szBuf, MAX_PATH);
    cchBuf := MAX_PATH;
    if PathUnExpandEnvStrings( Pchar(szPath),@szBuf[1],cchBuf) then
      Result := Pchar(szBuf)
    else
      Result := szPath;
  End;
}

  Function TestPath(ReferencePath,aTestPath:String):Boolean;
  Begin
    Result := (ReferencePath <> '') and
              (length(atestPath) > length(ReferencePath)) and
              (Ansipos(ReferencePath,aTestPath) = 1);
  End;

Begin
  result := false;
  aPath := ExpandUNCFileName(aPath);
  for I := 0 to 5 do
  Begin
    PPath := ExpandEnvStr(PathVariable[i]);
    if TestPath(PPath,aPath) then
    begin
      Result := true;
      exit;
    end;
  End;
End;
Nur weiß ich nicht ob das funktioniert.
Andreas
Monads? Wtf are Monads?

Geändert von QuickAndDirty ( 8. Sep 2012 um 11:59 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Dalai
Dalai

Registriert seit: 9. Apr 2006
1.684 Beiträge
 
Delphi 5 Professional
 
#9

AW: CSDIL_PROGRAM_FILES in 32Bit/64Bit

  Alt 8. Sep 2012, 15:19
Nur weiß ich nicht ob das funktioniert.
Das funktioniert im Prinzip und ist dabei eine der beiden einzigen Möglichkeiten (die ich kenne), von einem 32 Bit Programm an den Pfad "%SystemDrive%\Program Files" eines 64 Bit OS zu kommen. Die andere Möglichkeit wäre das Auslesen von [HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\Curr entVersion], Wert ProgramFilesDir aus der Registry mit dem Flag KEY_WOW64_64KEY für die Funktion OpenKey(). Ein ähnliches Problem hatte ich in diesem Thread vor einem halben Jahr geschildert und mit der Verwendung beider Methoden auch gelöst.

Im Grund schließe ich mich aber den Vorschreibern an, dass es besser wäre, die Installation zuzulassen und die Zugriffsrechte entsprechend zu setzen.

MfG Dalai
  Mit Zitat antworten Zitat
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
2.007 Beiträge
 
Delphi 12 Athens
 
#10

AW: CSDIL_PROGRAM_FILES in 32Bit/64Bit

  Alt 11. Sep 2012, 14:53
Ich glaube das Problem ist das ich in diesem Ordner keine Freigaben machen kann.
irgendwas war zumindest da, was macht das unser Programm so wie es jetzt ist nicht im Programme Ordner funktioniert,
obwohl NetShareAdd + Access_All
und SetFileSecurityRecursive + Userid #1#1#0#0#0#0#0#1#0#0#0#0 + DACL mit Vollzugriff
usw. gesetzt wird.

Um das Windows konform zu machen müssen wir noch ne menge Arbeit reinstecken...und da das keine Features sind die der Kunde würdigt ist das für Kunden Quasi leerlauf....entwicklungsstillstand...


Besonderen Dank euch, Dalai, Hathor, DanielProgramming, für die Info.
@All: ich weiß es ist nicht der beste weg, aber ich muss mir meine Zeit einteilen. So ist das Problem schon mal vom Tisch des Support, die keine Installationen mehr in Ordnung bringen müssen, Ich kann denen nicht sagen sie sollen mal eben 3-6 Monate mit dem Problem leben bis ich die beste aller Lösungen umgesetzt habe.
Andreas
Monads? Wtf are Monads?

Geändert von QuickAndDirty (11. Sep 2012 um 15:01 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


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 00:06 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz