Solved

Finding the Windows Desktop Directory

Posted on 2000-03-09
10
180 Views
Last Modified: 2010-04-04
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
Comment
Question by:gmnt
  • 6
  • 4
10 Comments
 
LVL 10

Expert Comment

by:Lischke
ID: 2601039
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
 
LVL 10

Expert Comment

by:Lischke
ID: 2601067
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
 

Author Comment

by:gmnt
ID: 2601073
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
Master Your Team's Linux and Cloud Stack!

The average business loses $13.5M per year to ineffective training (per 1,000 employees). Keep ahead of the competition and combine in-person quality with online cost and flexibility by training with Linux Academy.

 
LVL 10

Expert Comment

by:Lischke
ID: 2601082
Yep, the folder of the currently logged in user is returned.

Ciao, Mike
0
 

Author Comment

by:gmnt
ID: 2601181
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
 
LVL 10

Expert Comment

by:Lischke
ID: 2601209
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
 

Author Comment

by:gmnt
ID: 2601334
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
 
LVL 10

Accepted Solution

by:
Lischke earned 400 total points
ID: 2601355
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
 

Author Comment

by:gmnt
ID: 2601810
I needed an answer fast, and got it.
A nice quick and clean answer - much appreciated.
Garth.
0
 
LVL 10

Expert Comment

by:Lischke
ID: 2601997
I'm always glad to help (in particular when so many points are involved ;-)).

Good luck until next time,

Ciao, Mike
0

Featured Post

DevOps Toolchain Recommendations

Read this Gartner Research Note and discover how your IT organization can automate and optimize DevOps processes using a toolchain architecture.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

This article explains how to create forms/units independent of other forms/units object names in a delphi project. Have you ever created a form for user input in a Delphi project and then had the need to have that same form in a other Delphi proj…
Hello everybody This Article will show you how to validate number with TEdit control, What's the TEdit control? TEdit is a standard Windows edit control on a form, it allows to user to write, read and copy/paste single line of text. Usua…
Along with being a a promotional video for my three-day Annielytics Dashboard Seminor, this Micro Tutorial is an intro to Google Analytics API data.
Although Jacob Bernoulli (1654-1705) has been credited as the creator of "Binomial Distribution Table", Gottfried Leibniz (1646-1716) did his dissertation on the subject in 1666; Leibniz you may recall is the co-inventor of "Calculus" and beat Isaac…

770 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question