This functions opens a Windows Dialog in which you can select a folder and get the full path as string.

For more info:
http://msdn.microsoft.com/en-us/library/windows/desktop/bb773205(v=vs.85).aspx
http://msdn.microsoft.com/en-us/library/windows/desktop/bb762115(v=vs.85).aspx
http://msdn.microsoft.com/en-us/library/windows/desktop/bb762194(v=vs.85).aspx

Code:
typedef struct _BROWSEINFO
{
	long		hwndOwner;
	char*		pidlRoot;
	char*		pszDisplayName;
	char*		lpszTitle;
	long		ulFlags;
	long		lpfn;
	long		lParam;
	int		iImage;
}BROWSEINFO;

DWORD WINAPI SHBrowseForFolder(DWORD);
DWORD WINAPI SHGetPathFromIDList(long,long);
API(SHBrowseForFolder,shell32)
API(SHGetPathFromIDList,shell32)
#define PRAGMA_API SHBrowseForFolder;shell32!SHBrowseForFolderA
#define PRAGMA_API SHGetPathFromIDList;shell32!SHGetPathFromIDListA

#define BIF_RETURNONLYFSDIRS 0x00000001
#define BIF_DONTGOBELOWDOMAIN 0x00000002
#define BIF_STATUSTEXT 0x00000004
#define BIF_RETURNFSANCESTORS 0x00000008
#define BIF_EDITBOX 0x00000010
#define BIF_VALIDATE 0x00000020
#define BIF_NEWDIALOGSTYLE 0x00000040
#define BIF_BROWSEINCLUDEURLS 0x00000080
#define BIF_UAHINT 0x00000100
#define BIF_NONEWFOLDERBUTTON 0x00000200
#define BIF_NOTRANSLATETARGETS 0x00000400
#define BIF_BROWSEFORCOMPUTER 0x00001000
#define BIF_BROWSEFORPRINTER 0x00002000
#define BIF_BROWSEINCLUDEFILES 0x00004000
#define BIF_SHAREABLE 0x00008000
#define BIF_BROWSEFILEJUNCTIONS 0x00010000

function folder_dialog(STRING* dir)
{
	STRING* DirName = str_create("#255"); *DirName.chars=0;
	
	BROWSEINFO FOdlg;   memset(FOdlg, 0, sizeof(BROWSEINFO));   
	FOdlg.pszDisplayName    = DirName.chars;
	FOdlg.ulFlags				= NULL;
	
	long lpItem = SHBrowseForFolder(&FOdlg);
	
	if(lpItem==0)
	{
		str_remove(DirName);
		return(0);
	}
	else
	{
		SHGetPathFromIDList(lpItem, DirName.chars);
		str_cpy(dir, DirName);
		str_remove(DirName);
		return(1);
	}
}



How to use:
Code:
STRING* str_folder="";
folder_dialog(str_folder);