From: Zach Dennis Date: 2005-12-16T05:39:36+09:00 Subject: Re: [PATCH] Dir.tmpdir RDoc nobuyoshi nakada wrote: > Hi, > > At Thu, 15 Dec 2005 12:01:22 +0900, > Daniel Berger wrote in [ruby-core:06896]: > >>Also, GetSystemWindowsDirectory() is deprecated on >>Windows in favor of ShGetFolderPath(). From the MSDN >>docs: >> >>"Applications should store code in the Program Files >>folder and persistent data in the Application Data >>folder in the user's profile." > > > TEMP direcotry is defaulted to "%USERPROFILE%/Local > Settings/Temp", but how can you tell USERPROFILE with that > API? > --- begin code for windows 2000 and xp --- #include "windows.h" #include "shlobj.h" void main(){ HINSTANCE hDll= LoadLibrary( "shell32.dll" ); FARPROC proc; char cPath[256]; if( hDll ){ proc = GetProcAddress( hDll, "SHGetSpecialFolderPathA" ); if( proc ){ (proc)( NULL, cPath, CSIDL_PERSONAL, FALSE ); printf( "user home directory is:\n %s\n", cPath ); printf( "user temp directory is:\n %s\\Local Settings\\Temp", cPath ); } else{ printf( "Error calling function!\n" ); } } } --- end code --- The SHGetSpecialFolderPathA should really be "SHGetSpecialFolderPath" because windows is supposed to determine whether or not to call SHGetSpecialFolderPathA or SHGetSpecialFolderPathU (for ansii/unicode). I have never seen that actually happen though, I have always had to use SHGetSpecialFolderPathA for it to work, but perhaps there just needs to be a macro used here. --- begin code for windows 95, 98, 2000--- void main(){ HINSTANCE hDll= LoadLibrary( "shell32.dll" ); FARPROC proc; char cPath[256]; if( hDll ){ proc = GetProcAddress( hDll, "SHGetFolderPathA" ); if( proc ){ (proc)( NULL, CSIDL_PERSONAL, NULL, SHGFP_TYPE_CURRENT, cPath ); printf( "user home directory is:\n %s\n", cPath ); printf( "user temp directory is:\n %s\\Local Settings\\Temp", cPath ); } else{ printf( "Error calling function!\n" ); } } } --- end code --- The same rules apply to SHGetFolderPathA (in regards to calling the ansii/unicode version) if i remember correctly. There is no CSIDL_xxx value for the actual temporary directory, although you can find the current values at: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/shell/reference/enums/csidl.asp Information on SHGetFolderPath and SHGetSpecialFolderPath: http://msdn.microsoft.com/library/en-us/shellcc/platform/shell/reference/functions/shgetfolderpath.asp http://msdn.microsoft.com/library/en-us/shellcc/platform/shell/reference/functions/shgetspecialfolderpath.asp I hope this helps, Zach