Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Getallusers-Pfade: Notlösung (https://www.delphipraxis.net/77090-getallusers-pfade-notloesung.html)

Go2EITS 14. Sep 2006 14:34


Getallusers-Pfade: Notlösung
 
Ich habe nach Getallusers gesucht und keinen funktionierenden Code gefunden. Ich stelle Euch mal die "Notversion", der mir die Pfade liefert, hier zur Verbesserung rein.
[EDIT]
Verbesserungen dank Ultimator:
AddDirSeparator rausgeworfen, weil es ja IncludeTrailingPathDelimiter gibt!
Code hier geändert:
Delphi-Quellcode:
  // Ist hier Quatsch, weil ich ja sRootDir:='C:\dokumente und einstellungen'; vorgegeben habe.
    // für meinen Fall daher vorerst so:
     sSearchPath := IncludeTrailingPathDelimiter(sRootDir);
    //statt
     sSearchPath :='C:\dokumente und einstellungen\'

 
   /// Diese Zeile
  If DirectoryExists('C:\dokumente und einstellungen') then
  // wie folgt geändert:
  If DirectoryExists(sRootDir) then
Naja, solche Überlegungen kommen einem doch erst bei der intensiven Durchsicht. Nachfolgend steht der korrigierte Code.
[\EDIT]

Die Version Getsubdirs von Torry habe ich verändert und bekomme nun alle (User)Pfade unter "Dokumente und einstellungen". Sogar den HiddenDir "Default User". Ich weiss, es ist eine unsaubere Notlösung, weil ja wohl in jeder Sprache der Path anders lautet. Er geht halt nur auf einer deutschen Maschine. Für Verbesserungsvorschläge sind wir und ich sehr aufgeschlossen!

Delphi-Quellcode:
// Im VAR-Teil der Unit/Form einn TStringlist Namens "u" anlegen:
var
   u:TStringList; // Da stehen die Userpfade dann drin
Hier die von Torry geänderte Version GetSubDir in GetAllUser geändert und eingefügt:
Delphi-Quellcode:
Procedure GetAllUser;
var
  srSearch: TSearchRec;
  sSearchPath: string;
  i: Integer;
  sRootDir:string;
begin
  //Notlösung:
  sRootDir:='C:\dokumente und einstellungen';
  // Sicherheitsabfrage
  If DirectoryExists(sRootDir) then
  begin
  //
  u := TStringList.Create;
  u.BeginUpdate;
  try
    sSearchPath := IncludeTrailingPathDelimiter(sRootDir);
    if FindFirst(sSearchPath + '*', faDirectory or faHidden, srSearch) = 0 then
      repeat
        if ((srSearch.Attr and faDirectory) = faDirectory) and
          (srSearch.Name <> '.') and
          (srSearch.Name <> '..')then
          u.Add(sSearchPath + srSearch.Name);
        until (FindNext(srSearch) <> 0);
    FindClose(srSearch);
  finally
  u.EndUpdate;
  end;
end;
end;
Bitte unter Form.close ein
Delphi-Quellcode:
FreeAndNil(u);
einfügen, damit die Stringlist "u" sauber gelöscht wird.

Und so rufe ich mal die Procedure (über Button auf der Form) auf:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
  var i:Integer;
begin
      GetAllUser;
      // Nur zum Testen notwendig:
      showmessage('Anzahl User: '+(inttostr(u.count)));
      for i:=0 to U.count-1 do ShowMessage('UserPfade: '+u[i]);
end;

Luckie 14. Sep 2006 14:45

Re: Getallusers-Pfade: Notlösung
 
Was ist mit MSDN-Library durchsuchenSHGetSpecialFolderPath oder MSDN-Library durchsuchenSHGetSpecialFolderLocation?

Go2EITS 14. Sep 2006 14:59

Re: Getallusers-Pfade: Notlösung
 
Zitat:

SHGetSpecialFolderLocation Function
Retrieves a pointer to the ITEMIDLIST structure of a special folder.
Syntax

HRESULT SHGetSpecialFolderLocation( HWND hwndOwner,
int nFolder,
LPITEMIDLIST *ppidl
);
Parameters

hwndOwner
[in] Handle to the owner window the client should specify if it displays a dialog box or message box.
nFolder
[in] A CSIDL value that identifies the folder of interest.
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).
Return Value

Returns S_OK if successful, or an error value otherwise.

Remarks

With Microsoft Windows 2000, this function is superseded by SHGetFolderLocation.
Vielen Dank Luckie, damit kann ich aber nix anfangen.
Allein schon die *ppidl und CSIDL überfordert mich maßlos. Sonst wäre ich doch C++ Programmierer geworden und nicht Delphi.
Bekomme hier als Ergebnis ein Pointer auf die Liste einer Folder of interest. Prima! :)
So mach ich lieber einen Handstand wie oben! (Vorerst)
Trotzdem besten Dank für Deine Hilfe und beste Grüße! :thumb:
Go2EITS

Ultimator 14. Sep 2006 15:19

Re: Getallusers-Pfade: Notlösung
 
Hi GO2EITS,
die AddDirSeparator-Funktion hättest du dir sparen können, die gibts schon als Hier im Forum suchenIncludeTrailingPathDelimiter ;)

vlees91 14. Sep 2006 15:21

Re: Getallusers-Pfade: Notlösung
 
es geht ja glaube ich das man in Verknüpfungen {WINDOWS} (o.Ä.) angibt, und dann in C:\Windows oder C:\WINNT etc gelangt. evtl gibts sowas auch für die UserProfiles

Go2EITS 14. Sep 2006 15:57

Re: Getallusers-Pfade: Notlösung
 
@Ultimator
Vielen Dank! Und für alle, die mehr wissen wollen:
Uses Sysutils...

function IncludeTrailingPathDelimiter(const S: string): string;
Die Funktion stellt sicher, dass ein Pfadname mit einem Begrenzungszeichen endet.

function ExcludeTrailingPathDelimiter(const S: string): string;
Die Funktion stellt sicher, dass ein Pfadname ohne einem Begrenzungszeichen endet.

function IsPathDelimiter(const S: string; Index: Integer): Boolean;
Die Funktion gibt an, ob das Byte an der angegebenen Position eines Strings ein Pfadbegrenzungszeichen ist.

Ich glaube, darüber bin ich schon mal gestolpert... :pale:

@vleees91:
%WINDIR% ist das Zauberwort in Deinem Falle.
Ja, ganz bestimmt. Aber ich habe nichts zum Laufen gebracht.

Zur besseren Übersicht: Code oben "optimiert"!

Tschau!

Luckie 14. Sep 2006 22:01

Re: Getallusers-Pfade: Notlösung
 
Meinen Artikle über das %HOMEDIR% hast du ja schon gefunden. Es fehlt nur die passende CLSID. Leide rhabe ich die im MSDN auch nicht gefunden, aber es gibt sie bestimmt. Eventuell einfach mal in den entsprechenden Header-Dateien gucken. Ich habe jetzt keine Zeit dies noch zu tun, ich muss morgen wieder früh raus.

Christian Seehase 14. Sep 2006 22:30

Re: Getallusers-Pfade: Notlösung
 
Moin Luckie,

Zitat:

Zitat von Luckie
Leide rhabe ich die im MSDN auch nicht gefunden,

:shock: :gruebel:

Ich habe zur Zeit nicht das ganz aktuelle PSDK installiert, und dort steht:
CSIDL_PROFILE, und hat den Wert 0x0028 (bzw. $0028 für Delphi)

Die Umgebungsvariable hierfür ist übrigens HOMEPATH (nicht HOMEDIR) ;-)


@Go2EITS:

Wenn Dich die Parameter von SHGetSpecialFolderLocation überfordern, schau Dir mal MSDN-Library durchsuchenSHGetSpecialFolderPath an (wie Luckie ja schon vorgeschlagen hat).
Um den Ordner "Dokumente und Einstellungen" sprachunabhängig zu finden könntest Du auch CSIDL_PROFILES (0x003e) verwenden (IMHO erst ab XP verfügbar)

SirThornberry 14. Sep 2006 23:00

Re: Getallusers-Pfade: Notlösung
 
Aber auch mit ermittlung des Pfades ist es eine Notlösung weil dort auch Ordner zu finden sind von gelöschten Nutzern.

Luckie 14. Sep 2006 23:01

Re: Getallusers-Pfade: Notlösung
 
Damit bekommt man aber nur den Pfad für "Dokumente und Einstellungen" Er will aber den Pfad zu "All Users" haben. Allerdings, da er auch unter meinem deustchen Windows "All Users" heißt, könnte man auch CSIDL_PROFILE + "All Users" (hardgecodet) nehmen.

Christian Seehase 14. Sep 2006 23:04

Re: Getallusers-Pfade: Notlösung
 
Moin Luckie,

es gibt

CSIDL_PROFILES und CSIDL_PROFILE (ohne s) ;-)

Letzterer Wert verweist auf CSIDL_PROFILES\<Username> als HOMEPATH

[EDIT]
Ich hatte Deinen Beitrag zuerst falsch verstanden :oops: :wall:

Aber:
Da CSIDL_PROFILES erst ab XP zur Verfügung steht, kann man sich, als Basis, mit CSIDL_PROFILE und anschliessendem Abschneiden des Unterverzeichnisses behelfen.
Das klappt allerdings leider auch nicht sicher, da das Profil eines Users ja nicht zwingend unter "Dokumente und Einstellungen" liegen muss.

[/EDIT]

Luckie 14. Sep 2006 23:07

Re: Getallusers-Pfade: Notlösung
 
Ja, da sist mir klar:
CSIDL_PROFILES -> "Dokumente und Einstellungen"
CSIDL_PROFILE -> "Dokumente und Einstellungen\<Benutzername>"

Aber was ist die CLSID für "Dokumente und Einstellungen\All Users"? das ist doch die Frage.

Christian Seehase 14. Sep 2006 23:16

Re: Getallusers-Pfade: Notlösung
 
Moin Luckie,

nachdem ich mir jetzt noch einmal die verschiedenen CSIDL-Werte angeschaut habe:
Es gibt reichlich CSIDL_COMMON-Werte, die man benutzen kann.
Man erhält dann zwar eine Verzeichnisebene mehr als nötig, aber die abzuschneiden ist da wohl das kleinere Problem.

Oder man nimmt den "alten" Weg über Umgebungsvariablen.
ALLUSERSPROFILE gibt genau den gewünschten Pfad zurück.
Diese gibt es zumindest seit Windows 2000.

SirThornberry 15. Sep 2006 12:04

Re: Getallusers-Pfade: Notlösung
 
im eigentlichen ging es ja darum alle Nutzer zu finden/aufzulisten. Ich finde man sollte ansetzen das ordentlich hinn zu bekommen und nicht einfach nur auflisten welche Nutzerprofile auf dem Rechner noch vorhanden sind. Zum einen können einige Nutzer schon wieder gelöscht sein, zum anderen gibt es auch die Möglichkeit das sich ein Nutzer noch nicht angemeldet hat und dann exisitert auch der Ordner noch nicht.
Oder hab ich den ersten Beitrag missverstanden und es geht gar nicht darum alle nutzer zu finden?

shmia 15. Sep 2006 12:25

Re: Getallusers-Pfade: Notlösung
 
Wie wär's damit:
Code:
BOOL GetProfilesDirectory(
  LPTSTR lpProfilesDir,
  LPDWORD lpcchSize
);
Requires Windows XP, Windows 2000 Professional, or Windows NT Workstation 4.0

Go2EITS 15. Sep 2006 13:18

Re: Getallusers-Pfade: Notlösung
 
@ SirThornberry
Eigentlich möchte ich die alle User, einschließlich dem Pfath:
Administrator
<User1>
<User2>
All Users

und
DEFAULT USER

Dabei sind gelöschte User nicht relevant. (Was will ich auch mit denen?)
Mit der "Notlösung" bekomme ich die Pfade. Der Thread zeigt, dass es nicht so einfach ist. Und klar: Zugriff darauf nur als Admin.

Der Sinn und Zweck ist es, z. B. die Inhalte des Recent-Verzeichnisses oder Temp zu löschen. Also nicht nur die Administrator\Recent sondern auch die betreffenden Verzeichnisse von den Benutzern. (z. B. mich selbst). Ob es sinvoll ist, entscheidet der Admin, der ein "Deepclean" oder "normales" Clean verwenden kann. Dies ist für Backup/Images oder ein schlankes System durchaus sinnvoll, oder auch um Trojaner und Viren zu "vertreiben", die sich, wie ich gesehen habe, sich auch als Kopie in der \TEMP und/oder auch als .tmp getarnt tummeln können.

Hier mal die CSIDL, von denen wohl die Rede ist und meiner Ansicht nach in Luckies Artikel der Vollständigkeithalber gehören würde:

Zitat:

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;
%HomeDir%

Der Code von Luckie funzt einwandfrei. Aber ich bekomme nur "meine" Pfade und die der "All Users"
wenn ich es richtig gesehen habe. Meine "Notlösung" - nur als Admin - greift darüber.

@shmia
Magst Du nicht ein wenig konkreter werden?
Zitat:

BOOL GetProfilesDirectory(
LPTSTR lpProfilesDir,
LPDWORD lpcchSize
);
damit komme ich nicht klar. Wie muss ich was, wo und wann einbinden und wie dann aufrufen?

Eine Lösung für C:\dokumente und einstellungen\ hätte ich auch.
Ich rufe Lukies Code auf und lese zwischen dem erstem Backslash bis zum zweiten Backslash den Text aus. Et voilá: Da haben wir eine universelle Routine.

Wenn der Thread zu einer sauberen Lösung führen würde, dann hat es sich für uns gelohnt. Sonst bleibt nur die Notlösung.

Beste Grüße an die DP!

shmia 15. Sep 2006 13:43

Re: Getallusers-Pfade: Notlösung
 
Zitat:

Zitat von Go2EITS
@shmia
Magst Du nicht ein wenig konkreter werden?
Zitat:

BOOL GetProfilesDirectory(
LPTSTR lpProfilesDir,
LPDWORD lpcchSize
);
damit komme ich nicht klar. Wie muss ich was, wo und wann einbinden und wie dann aufrufen?

Na das ist eine Windows API Funktion, die man benutzen kann/sollte.
http://windowssdk.msdn.microsoft.com.../ms713356.aspx
Delphi-Quellcode:
function GetProfilesDirectory(lpProfilesDir:PChar; var lpcchSize:DWORD):wordbool;

function GetProfilesDirectory; external 'userenv.dll' name 'GetProfilesDirectoryA';

function LeseBenutzerProfilVerzeichnis:string;
var
   len : DWORD;
begin
   len := 264;
   SetLength(result, len);
   if not GetProfilesDirectory(Pchar(benutzerprofilverz), len) then
      RaiseLastWin32Error;
   SetLength(Result, len);
end;
Das wäre dann der Ersatz für "C:\dokumente und einstellungen", denn das Verzeichnis könnte ja auch "C:\Documents and Settings" oder sonstwie heisen.

PS:
man kann auch NetUserEnum benützen, dann ist es keine Notlösung mehr:
http://www.nldelphi.com/forum/showth...&threadid=6308

Go2EITS 15. Sep 2006 13:56

Re: Getallusers-Pfade: Notlösung
 
@Shmia
Vielen Dank!
Das probiere ich in Kürze aus und versuche es in der "Notlösung" einzubauen. Wenn es geht, davon gehe ich aus, sind es klasse Beiträge zum Problem. Super! :thumb:

Beste Grüße
Go2EITS

Go2EITS 15. Sep 2006 14:28

Re: Getallusers-Pfade: Notlösung
 
Also so geht es leider nicht:
Nach Implementation habe ich:
Function GetProfilesDirectory; external 'userenv.dll' name 'GetProfilesDirectoryA';
Der Compiler meckert: Die Funktion benötigt Ereignistyp...
Das funktioniert also nicht.
Aber
Delphi-Quellcode:
function GetProfilesDirectory(lpProfilesDir:PChar; var lpcchSize:DWORD):Wordbool;external 'userenv.dll' name 'GetProfilesDirectoryA';
eingebunden.

Nun Deine Funktion eingefügt:
Delphi-Quellcode:
function LeseBenutzerProfilVerzeichnis:string;
var
   len : DWORD;
   begin
   len := 264;
   SetLength(result, len);
   if not GetProfilesDirectory(PChar(benutzerprofilverz), len) then
      RaiseLastWin32Error;
   SetLength(Result, len);
end;
Benutzerprofilverz ist nicht definiert, also schnell benutzerprofilverz als STRING und als PCHAR
unter Var eingefügt. Compililierung ok. Aber die Ausführung wird mit Exceptions beendet.
Ich habe dann stdcall vor external eingefügt. Aber auch das funzt nicht.

Kannst Du mir bitte weiterhelfen? So können wohl nur die Profis damit etwas anfangen.

Luckie 15. Sep 2006 16:51

Re: Getallusers-Pfade: Notlösung
 
Guck mal in der Registry: HLKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList

Go2EITS 15. Sep 2006 17:29

Re: Getallusers-Pfade: Notlösung
 
@Luckie
Hab gegugt und den schnell geschrieben (vor 3 Monaten noch undenkbar) und getestet und es läuft unter XP/Windows2000.
Delphi-Quellcode:
Function GetProfilesDir:String;
var
  Reg: TRegistry;
  Dir,Systemdrive:String;
  begin
  result:='';Dir:='';
  Reg := TRegistry.Create;
  try
  with Reg do
  begin
  RootKey := HKEY_LOCAL_MACHINE;
  OpenKey('SOFTWARE\Microsoft\Windows NT\CurrentVersion\Profilelist', False);
  Dir:=ReadString('ProfilesDirectory');
  // Systemdrive
  Systemdrive:=Expandenvironment('%Systemdrive%');
  // Ergebnis von '%Systemdrive%' "befreien"
  delete(dir,1,13);
  // Systemdrive + Dir =
  Result:=Systemdrive+dir;;
  CloseKey;
  Free;
  end;
  except on E:Exception do
     begin
     ShowMessage('Registry: Lesen von SOFTWARE\Microsoft\Windows NT\CurrentVersion\Profilelist fehlgeschlagen');
     end;
end;
end;
Danke Luckie! :thumb: Man soll doch den Tag nicht vor dem Abend loben!
Beste Grüße
Go2EITS

Luckie 16. Sep 2006 00:42

Re: Getallusers-Pfade: Notlösung
 
Deine Exception wird nie ausgelöst werden. API Funktionen lösen keine Exception aus. Dafür geben sie aber Rückgabewerte zurück, die man auswerten kann, wie zum Beispiel bei OpenRegistry.

Go2EITS 17. Sep 2006 09:37

Re: Getallusers-Pfade: Notlösung
 
@Luckie:
Danke für den Hinweis. Nachstehend das Ergebnis, das mir Eurer Hilfe entstanden ist!

Da hier ein Missverstänis vorliegt:
Ich will alle Benutzer unter "Dokumente und Einstellungen".
Also nicht nur C:\Dokumente und Einstellungen\All Users sondern alle Einträge.
Admin, All Users, Default User, und andere Benutzer, die in unter "Dokumente und Einstellungen"
stehen. Das ist mit dem Thread und der "Notlösung" die nun eine gute, variable Lösung geworden ist. DP sei Dank! :thumb:

Wir brauchen zuerst:
function ExpandEnvironment(const strValue: string): string;
function GetProfilesDir:String;
und dann die Hauptprocedure:
procedure GetAllUser;

Delphi-Quellcode:
function ExpandEnvironment(const strValue: string): string;
var
  chrResult: array[0..1023] of Char;
  wrdReturn: DWORD;
begin
  wrdReturn := ExpandEnvironmentStrings(PChar(strValue), chrResult, 1024);
  if wrdReturn = 0 then
    Result := strValue
  else
  begin
    Result := Trim(chrResult);
  end;
end;

function GetProfilesDir:String;
var
  Reg: TRegistry;
  Dir,Systemdrive:String;
  begin
  result:='';Dir:='';
  Reg := TRegistry.Create;
  with Reg do
      begin
      RootKey := HKEY_LOCAL_MACHINE;
      if OpenKey('SOFTWARE\Microsoft\Windows NT\CurrentVersion\Profilelist', False) then
         begin
         Dir:=ReadString('ProfilesDirectory');
         // Systemdrive
         Systemdrive:=Expandenvironment('%Systemdrive%');
         // Ergebnis von '%Systemdrive%' "befreien"
         Delete(Dir,1,13);
         // Systemdrive + Dir = ? Ergebnis
         Result:=Systemdrive+Dir;;
         CloseKey;
         end;
      Free;
     end;
end;

Procedure GetAllUser;
var
  srSearch: TSearchRec;
  sSearchPath: string;
  i: Integer;
  sRootDir:string;
begin
   // z. b. C:\Dokumente und Einstellungen
   sRootDir:=GetProfilesDir;
  // Sicherheitsabfrage
   If DirectoryExists(srootdir) then
      begin
      u := TStringList.Create;
      u.BeginUpdate;
      try
      sSearchPath :=IncludeTrailingPathDelimiter(sRootDir);
      if FindFirst(sSearchPath + '*', faDirectory or faHidden, srSearch) = 0 then
         repeat
         if ((srSearch.Attr and faDirectory) = faDirectory) and
            (srSearch.Name <> '.') and
            (srSearch.Name <> '..')then
            u.Add(sSearchPath + srSearch.Name);
         until (FindNext(srSearch) <> 0);
      FindClose(srSearch);
      finally
      u.EndUpdate;
      end;//TRY...
      end;// IF...
end;
So. Nun noch:
Delphi-Quellcode:
// Im VAR-Teil der Unit/Form eine TStringlist Namens "u" anlegen:
var u:TStringList; // Da stehen die Userpfade dann drin
Bitte unter Form.close ein
Delphi-Quellcode:
FreeAndNil(u);
einfügen, damit die Stringlist "u" sauber gelöscht wird.

Und so rufe ich mal die Procedure (über Button auf der Form) auf:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
  var i:Integer;
begin
      GetAllUser;
      // Nur zum Testen notwendig:
      showmessage('Anzahl User: '+(inttostr(u.count)));
      for i:=0 to U.count-1 do ShowMessage('UserPfade: '+u[i]);
end;
PS: Code aus Compiler übernommen und nicht "aus dem Kopf" geschrieben! Müsste "fehlerfrei" sein.
Viel Vergnügen!
Go2EITS

shmia 18. Sep 2006 12:55

Re: Getallusers-Pfade: Notlösung
 
Hier nochmal der richtige Code zum Auslesen des Profilverzeichnisses:
Delphi-Quellcode:
interface

function GetProfilesDirectoryA(lpProfilesDir: LPSTR; var lpcchSize: DWORD): BOOL; stdcall;
{$EXTERNALSYM GetProfilesDirectoryA}
function GetProfilesDirectoryW(lpProfilesDir: LPWSTR; var lpcchSize: DWORD): BOOL; stdcall;
{$EXTERNALSYM GetProfilesDirectoryW}
function GetProfilesDirectory(lpProfilesDir: LPTSTR; var lpcchSize: DWORD): BOOL; stdcall;
{$EXTERNALSYM GetProfilesDirectory}

implementation

const
   userenvlib = 'userenv.dll';

function GetProfilesDirectoryA; external userenvlib name 'GetProfilesDirectoryA';
function GetProfilesDirectoryW; external userenvlib name 'GetProfilesDirectoryW';
function GetProfilesDirectory; external userenvlib name 'GetProfilesDirectoryA';

function LeseBenutzerProfilVerzeichnis:string;
var
   len : DWORD;
   begin
   len := 264;
   SetLength(result, len);
   if not GetProfilesDirectoryA(PChar(Result), len) then
      RaiseLastWin32Error;
   SetLength(Result, len);
end;
Über die JEDI API Library ( http://jedi-apilib.sourceforge.net/ ) erhält man Zugriff auf alle
Funktionen der DLL userenv.dll.
Reinschauen lohnt sich.

himitsu 18. Sep 2006 13:21

Re: Getallusers-Pfade: Notlösung
 
Eine Frage:
Wieso eigentlich 264?

Zitat:

Delphi-Quellcode:
len := 264;


PS:
MAX_PATH = 260
Und in Windows kann ein Pfad in der Ansi-Version nicht länger als 259 Zeichen ( + #0 ) sein.
Also maximal 256 Zeichen im Dateisystemtreiber + 3 für's Laufwerk (z.B. "A:\")


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:06 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