• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 191
  • Last Modified:

Finding the Windows Desktop Directory

Is there a quick one-line way of finding the Windows Desktop Directory so that an application can save a file to it independent of directory structure. e.g. c:\windows\desktop, or c:\windows\users\frank\desktop etc..???

Looking for an answer asap on this so am prepared to offer 400 points for this one.
0
gmnt
Asked:
gmnt
  • 6
  • 4
1 Solution
 
LischkeCommented:
Here's one solution. Not a one liner but short enough, I think:

function GetDesktopFolderName: String;

var
  AReg: TRegIniFile;

begin
  Result := '';
  AReg := TRegIniFile.Create('Software\MicroSoft\Windows\CurrentVersion\Explorer');
  Result := AReg.ReadString('Shell Folders', 'Desktop', '');
  AReg.Free;
end;


Ciao, Mike
0
 
LischkeCommented:
and here's another one:

function GetDesktopFolder: String;

var
  Buffer: array[0..MAX_PATH] of Char;
  PIDL: PItemIDList;

begin
  SHGetSpecialFolderLocation(Handle, CSIDL_DESKTOP, PIDL);
  SHGetPathFromIDList(PIDL, Buffer);
  Result := Buffer;
end;

Ciao, Mike
0
 
gmntAuthor Commented:
How does this react if, for example, the PC has multiple users and there are a number of desktop folders? Does it use the desktop of the currently active user i.e. the one actually logged in and running the application?
0
Free Tool: Site Down Detector

Helpful to verify reports of your own downtime, or to double check a downed website you are trying to access.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

 
LischkeCommented:
Yep, the folder of the currently logged in user is returned.

Ciao, Mike
0
 
gmntAuthor Commented:
I think the first one is easier to understand - Are there any specifics I need e.g. in "uses" etc or just declare the function at the top?
0
 
LischkeCommented:
Nothing special to consider. Just take in Registry into the uses clause and copy the code out. Btw: the second code is not much harder than the first one. You need to include ShlObj and with this SHGet* stuff you are independent of eventual changes Microsoft makes to the registry in future Windows versions.

Ciao, Mike
0
 
gmntAuthor Commented:
I'm getting errors:
Undeclared identifier: 'Handle'
Unsatisfied forward or external declaration: 'TfrmMain.GetDesktopFolder'

I've included ShlObj and have declared the function with all the others:

procedure btnAboutClick(Sender: TObject);
procedure cmbSlot1Change(Sender: TObject);
function GetDesktopFolder: String;
private
      { Private declarations }

Any suggestions (btw using Delphi 4)
0
 
LischkeCommented:
Oops, sorry. Replace Handle simply with 0. This was the handle of my TForm, but you don't need this value to pass.

Ciao, Mike
0
 
gmntAuthor Commented:
I needed an answer fast, and got it.
A nice quick and clean answer - much appreciated.
Garth.
0
 
LischkeCommented:
I'm always glad to help (in particular when so many points are involved ;-)).

Good luck until next time,

Ciao, Mike
0

Featured Post

Learn to develop an Android App

Want to increase your earning potential in 2018? Pad your resume with app building experience. Learn how with this hands-on course.

  • 6
  • 4
Tackle projects and never again get stuck behind a technical roadblock.
Join Now