Determining User's home directory on win32

Please don’t hard-code “C:\Program Files”, as the
directory has different names depending upon the
region that the OS is configure for. I know that in
the German version of windows it is called something

In my own project I have the following source file.
Notice that I can’t include the normal headers for my
project, as the shell library includes some crap that
breaks my builds. Anyway, here is a starting point:

(plus, at work, our “home” folder is really a network
drive. It follows us around where ever we go.
Hard-coding a data path to “C:” would not work in this

/* $Id: 16 2004-03-27 16:21:01Z djenkins
$ */

/* This is compiled seperately, and without including
because including ‘Shlobj.h’ causes compiler errors
if included with
’platform.h’. */

#if !defined(WIN32)
#error “Only compile this under Win32!”

#define STRICT
#include <windows.h>
#include <Shlobj.h>

bool Win32_GetDocPath(std::string &sDocPath)
IShellFolder *folder = 0;
ITEMIDLIST *itemidlistptr = 0;
IMalloc *alloc = 0;
char szDocPath[MAX_PATH];

SHGetSpecialFolderLocation(0, CSIDL_PERSONAL,


SHGetPathFromIDList(itemidlistptr, szDocPath);

if (!SUCCEEDED(SHGetMalloc(&alloc)))
	return false;


sDocPath = szDocPath;

return true;

Dennis Jenkins