Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi CSDIL_PROGRAM_FILES in 32Bit/64Bit (https://www.delphipraxis.net/170260-csdil_program_files-32bit-64bit.html)

QuickAndDirty 7. Sep 2012 15:47

CSDIL_PROGRAM_FILES in 32Bit/64Bit
 
Hallo ich muss aus einem 32 Bit Programm heraus ermitteln
ob ein ein angeebener Pfad dem Programme Verzeichnis entspricht bzw. darin liegt.

Das muss auch funktionieren wenn das Programm auf einem 64Bit Betriebsystem läuft.

Ich mache das wie folgt:
Delphi-Quellcode:
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls,
  Registry,
  ActiveX,
  ComObj,
  ShlObj;

Function CheckForProgramFilesPath(aPath:String):Boolean;
var Ppath:String;
    hPath: PChar;
    pIdl: PItemIDList
Begin
  aPath := ExpandUNCFileName(aPath);
  PPath := '';
  if SUCCEEDED(SHGetSpecialFolderLocation(0, CSIDL_PROGRAM_FILES, pidl)) then
  begin
    hPath := StrAlloc(MAX_PATH);
    SHGetPathFromIDList(pIdl, hPath);
    PPath := hPath;
    StrDispose(hPath);
  end;
  FreePIDL(pIdl);
  Result := Ansipos(PPath, aPath) = 1;
End;
Ich bin mir nicht ganz sicher, kann es hier auch nicht testen, aber kann es sein das dieser Code auf einem 64Bit Betriebssystem nicht funktioniert?

Was gibt SHGetSpecialFolderLocation für CSIDL_PROGRAM_FILES zurrück wenn man es auf einem 64 Bit Betriebsystem mit einer 32 Bit Anwendung abfragt?

DanielProgramming 7. Sep 2012 16:07

AW: CSDIL_PROGRAM_FILES in 32Bit/64Bit
 
C:\Program Files (x86) bei mir (englisches Windows 7 x64, Delphi XE3 Testversion, Zielsystem: Win32)

QuickAndDirty 7. Sep 2012 16:28

AW: CSDIL_PROGRAM_FILES in 32Bit/64Bit
 
Uff.
Das könnte erklären warum das schief geht.

Kannst du auch ExpandUNCFileName('C:\Program Files')
testen?

Wenn das etwas anderes liefert als das Kompatibilitäts Verzeichnis habe ich ein Problem.

DanielProgramming 7. Sep 2012 16:36

AW: CSDIL_PROGRAM_FILES in 32Bit/64Bit
 
Kommt C:\Program Files raus

QuickAndDirty 7. Sep 2012 17:23

AW: CSDIL_PROGRAM_FILES in 32Bit/64Bit
 
Das erklärt dann mein problem!

Danke !

RWarnecke 7. Sep 2012 19:39

AW: CSDIL_PROGRAM_FILES in 32Bit/64Bit
 
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.

hathor 8. Sep 2012 09:04

AW: CSDIL_PROGRAM_FILES in 32Bit/64Bit
 
"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)

QuickAndDirty 8. Sep 2012 10:17

AW: CSDIL_PROGRAM_FILES in 32Bit/64Bit
 
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.

hathor 8. Sep 2012 10:24

AW: CSDIL_PROGRAM_FILES in 32Bit/64Bit
 
Liste der Anhänge anzeigen (Anzahl: 1)
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;

Luckie 8. Sep 2012 11:50

AW: CSDIL_PROGRAM_FILES in 32Bit/64Bit
 
Warum nicht ParamStr(0) oder ist es nicht das eigene Programm?


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

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