I use a function which uses the SHGetSpecialFolderLocation Windows API
function.

 

function GetSpecialFolder(const FolderId: integer): string;

var

  ppidl : PItemIdList;

begin

  if SHGetSpecialFolderLocation(Application.MainForm.Handle,FolderId,ppidl)
= NOERROR then

  begin

    SetLength(Result,MAX_PATH);

    if SHGetPathFromIDList(ppidl,PChar(Result)) then

      SetLength(Result,StrLen(PChar(Result)))

    else

      Result := '';

  end

  else Result := '';

end;

 

Then you need to call it with the a CSIDL_ constant as defined in ShlObj.pas
such as CSIDL_APPDATA.  Here is a list I found on the internet.

 

  CSIDL_DESKTOP = $0;                 //(desktop)

  CSIDL_INTERNET = $1;                //Internet Explorer (icon on desktop)

  CSIDL_PROGRAMS = $2;                //Start Menu\Programs

  CSIDL_CONTROLS = $3;                //My Computer\Control Panel

  CSIDL_PRINTERS = $4;                //My Computer\Printers

  CSIDL_PERSONAL = $5;                //My Documents

  CSIDL_FAVORITES = $6;               //(user)\Favourites

  CSIDL_STARTUP = $7;                 //Start Menu\Programs\Startup

  CSIDL_RECENT = $8;                  //(user)\Recent

  CSIDL_SENDTO = $9;                  //(user)\SendTo

  CSIDL_BITBUCKET = $A;               //(desktop)\Recycle Bin

  CSIDL_STARTMENU = $B;               //(user)\Start Menu

  CSIDL_DESKTOPDIRECTORY = $10;       //(user)\Desktop

  CSIDL_DRIVES = $11;                 //My Computer

  CSIDL_NETWORK = $12;                //Network Neighbourhood

  CSIDL_NETHOOD = $13;                //(user)\nethood

  CSIDL_FONTS = $14;                  //windows\fonts

  CSIDL_TEMPLATES = $15;

  CSIDL_COMMON_STARTMENU = $16;       //All Users\Start Menu

  CSIDL_COMMON_PROGRAMS = $17;        //All Users\Programs

  CSIDL_COMMON_STARTUP = $18;         //All Users\Startup

  CSIDL_COMMON_DESKTOPDIRECTORY = $19;//All Users\Desktop

  CSIDL_APPDATA = $1A;                //(user)\Application Data

  CSIDL_PRINTHOOD = $1B;              //(user)\PrintHood

  CSIDL_LOCAL_APPDATA = $1C;          //(user)\Local Settings\Application
Data (non roaming)

  CSIDL_ALTSTARTUP = $1D;             //non localized startup

  CSIDL_COMMON_ALTSTARTUP = $1E;      //non localized common startup

  CSIDL_COMMON_FAVORITES = $1F;

  CSIDL_INTERNET_CACHE = $20;

  CSIDL_COOKIES = $21;

  CSIDL_HISTORY = $22;

  CSIDL_COMMON_APPDATA = $23;          //All Users\Application Data

  CSIDL_WINDOWS = $24;                 //GetWindowsDirectory()

  CSIDL_SYSTEM = $25;                  //GetSystemDirectory()

  CSIDL_PROGRAM_FILES = $26;           //C:\Program Files

  CSIDL_MYPICTURES = $27;              //C:\Program Files\My Pictures

  CSIDL_PROFILE = $28;                 //USERPROFILE

  CSIDL_SYSTEMX86 = $29;               //x86 system directory on RISC

  CSIDL_PROGRAM_FILESX86 = $2A;        //x86 C:\Program Files on RISC

  CSIDL_PROGRAM_FILES_COMMON = $2B;    //C:\Program Files\Common

  CSIDL_PROGRAM_FILES_COMMONX86 = $2C; //x86 Program Files\Common on RISC

  CSIDL_COMMON_TEMPLATES = $2D;        //All Users\Templates

  CSIDL_COMMON_DOCUMENTS = $2E;        //All Users\Documents

  CSIDL_COMMON_ADMINTOOLS = $2F;       //All Users\Start
Menu\Programs\Administrative Tools

  CSIDL_ADMINTOOLS = $30;              //(user)\Start
Menu\Programs\Administrative Tools

  CSIDL_FLAG_CREATE = $8000;           //combine with CSIDL_ value to force
create on SHGetSpecialFolderLocation()

  CSIDL_FLAG_DONT_VERIFY = $4000;      //combine with CSIDL_ value to force
create on SHGetSpecialFolderLocation()

  CSIDL_FLAG_MASK = $FF00;             //mask for all possible flag values

 

 

 

-----Original Message-----
From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] On
Behalf Of John Bird
Sent: Monday, 18 June 2007 21:00
To: 'NZ Borland Developers Group - Delphi List'
Subject: RE: [DUG] Anyone need XP Pro?

 

Vista:

 

I have not actually worked day to day yet in Vista, but two things I see

about it I am all in favour of.

 

1 - UAC - as a long time Unix user used to running as a non admin (root)

user I just got used to setting up data folders and ownerships and

permissions.  It's a necessary "evil" that is not so hard and best to just

do it and get used to how the OS wants to protect itself and you.  Its

always a good programming practice to be able separate programs and settings

files and data files anyway, from what I have found if you have well

specified folders for eg settings then you have maybe just one folder to

make sure you have the approriate write permissions to.

 

2 - From what I have seen of the Vista folder structures they are a lot

flatter and more easy to find than XP - the huge tree under "Documents and

Settings" I find really obscure and seems to me an exercise in creating

security by making it really hard to find where the actual important files

are likely to be.   In fact I got the impression that someone at Microsoft

said "OK lets finally admit that something like the Unix folder structure

makes more sense".  Have a Users folder, with usernames under that, and

under each user folder folders for pictures and documents etc - guess where

that comes from.

 

However the Windows permissions and folder structures are much more complex

and arbitrary to my mind than the logical structures on Unix.  I think

that's one of the reasons almost no-one outside of Microsoft got comfortable

with them.

 

So far I create my own folder structures all under my own folder (which is

NOT under Program Files) so I can set the permissions on these without

upsetting anything else.

 

However it would be tidier to follow the conventions - its usually easier to

swim with the stream than against it!

 

Question:

 

I remember once coming across a Delphi unit that can return all the Windows

folder settings for almost everything (temp files, program files, Windows

folder, Start menu user, Start menu all users, etc etc).  Can't find it!

Does anyone know of a version that gives the locations for all common

versions (98, 2000, XP and Vista)?  That would be an excellent level of

abstraction to add to any program.

 

Anyone have or know of such a unit/utility/component?

 

John

_______________________________________________
NZ Borland Developers Group - Delphi mailing list
Post: delphi@delphi.org.nz
Admin: http://delphi.org.nz/mailman/listinfo/delphi
Unsubscribe: send an email to [EMAIL PROTECTED] with Subject: unsubscribe

Reply via email to