windirs.pp 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486
  1. unit WinDirs;
  2. {*******************************************************************************
  3. IMPORTANT NOTES:
  4. SHGetFolderPath function is deprecated. Only some CSIDL values are supported.
  5. As of Windows Vista, this function is merely a wrapper for SHGetKnownFolderPath.
  6. The CSIDL value is translated to its associated KNOWNFOLDERID and then SHGetKnownFolderPath
  7. is called. New applications should use the known folder system rather than the older
  8. CSIDL system, which is supported only for backward compatibility.
  9. Official list of CSIDL and FOLDERID constants:
  10. https://msdn.microsoft.com/en-us/library/windows/desktop/bb762494.aspx
  11. https://msdn.microsoft.com/en-us/library/windows/desktop/dd378457.aspx
  12. *******************************************************************************}
  13. {$mode objfpc}
  14. {$H+}
  15. interface
  16. // CSIDL_* contants are also declared in "ShellApi" and "shfolder" units.
  17. // If changed, remember to add an appropriate mapping in CSIDLtoFOLDERID list.
  18. const
  19. CSIDL_PROGRAMS = $0002; { %SYSTEMDRIVE%\Program Files }
  20. CSIDL_PERSONAL = $0005; { %USERPROFILE%\My Documents }
  21. CSIDL_FAVORITES = $0006; { %USERPROFILE%\Favorites }
  22. CSIDL_STARTUP = $0007; { %USERPROFILE%\Start menu\Programs\Startup }
  23. CSIDL_RECENT = $0008; { %USERPROFILE%\Recent }
  24. CSIDL_SENDTO = $0009; { %USERPROFILE%\Sendto }
  25. CSIDL_STARTMENU = $000B; { %USERPROFILE%\Start menu }
  26. CSIDL_MYMUSIC = $000D; { %USERPROFILE%\Documents\My Music }
  27. CSIDL_MYVIDEO = $000E; { %USERPROFILE%\Documents\My Videos }
  28. CSIDL_DESKTOPDIRECTORY = $0010; { %USERPROFILE%\Desktop }
  29. CSIDL_NETHOOD = $0013; { %USERPROFILE%\NetHood }
  30. CSIDL_FONTS = $0014; { %SYSTEMROOT%\Fonts }
  31. CSIDL_TEMPLATES = $0015; { %USERPROFILE%\Templates }
  32. CSIDL_COMMON_STARTMENU = $0016; { %PROFILEPATH%\All users\Start menu }
  33. CSIDL_COMMON_PROGRAMS = $0017; { %PROFILEPATH%\All users\Start menu\Programs }
  34. CSIDL_COMMON_STARTUP = $0018; { %PROFILEPATH%\All users\Start menu\Programs\Startup }
  35. CSIDL_COMMON_DESKTOPDIRECTORY = $0019; { %PROFILEPATH%\All users\Desktop }
  36. CSIDL_APPDATA = $001A; { %USERPROFILE%\Application Data (roaming) }
  37. CSIDL_PRINTHOOD = $001B; { %USERPROFILE%\Printhood }
  38. CSIDL_LOCAL_APPDATA = $001C; { %USERPROFILE%\Local Settings\Application Data (non roaming) }
  39. CSIDL_COMMON_FAVORITES = $001F; { %PROFILEPATH%\All users\Favorites }
  40. CSIDL_INTERNET_CACHE = $0020; { %USERPROFILE%\Local Settings\Temporary Internet Files }
  41. CSIDL_COOKIES = $0021; { %USERPROFILE%\Cookies }
  42. CSIDL_HISTORY = $0022; { %USERPROFILE%\Local settings\History }
  43. CSIDL_COMMON_APPDATA = $0023; { %PROFILESPATH%\All Users\Application Data }
  44. CSIDL_WINDOWS = $0024; { %SYSTEMROOT% }
  45. CSIDL_SYSTEM = $0025; { %SYSTEMROOT%\SYSTEM32 (may be system on 95/98/ME) }
  46. CSIDL_PROGRAM_FILES = $0026; { %SYSTEMDRIVE%\Program Files }
  47. CSIDL_MYPICTURES = $0027; { %USERPROFILE%\My Documents\My Pictures }
  48. CSIDL_PROFILE = $0028; { %USERPROFILE% }
  49. CSIDL_PROGRAM_FILES_COMMON = $002B; { %SYSTEMDRIVE%\Program Files\Common }
  50. CSIDL_COMMON_TEMPLATES = $002D; { %PROFILEPATH%\All Users\Templates }
  51. CSIDL_COMMON_DOCUMENTS = $002E; { %PROFILEPATH%\All Users\Documents }
  52. CSIDL_COMMON_ADMINTOOLS = $002F; { %PROFILEPATH%\All Users\Start Menu\Programs\Administrative Tools }
  53. CSIDL_ADMINTOOLS = $0030; { %USERPROFILE%\Start Menu\Programs\Administrative Tools }
  54. CSIDL_COMMON_MUSIC = $0035; { %PROFILEPATH%\All Users\Documents\my music }
  55. CSIDL_COMMON_PICTURES = $0036; { %PROFILEPATH%\All Users\Documents\my pictures }
  56. CSIDL_COMMON_VIDEO = $0037; { %PROFILEPATH%\All Users\Documents\my videos }
  57. CSIDL_CDBURN_AREA = $003B; { %USERPROFILE%\Local Settings\Application Data\Microsoft\CD Burning }
  58. CSIDL_PROFILES = $003E; { %PROFILEPATH% }
  59. // NOTE: CSIDL_PROFILES has been removed from Microsoft official documentation!
  60. CSIDL_FLAG_CREATE = $8000; { (force creation of requested folder if it doesn't exist yet) }
  61. // FOLDERID_* constants parsed from KnownFolders.h file in
  62. // Windows 10 SDK for Fall Creators Update (10.0.16299.91).
  63. // If changed, remember to add an appropriate mapping in CSIDLtoFOLDERID list.
  64. const
  65. FOLDERID_AccountPictures : TGUID = '{008CA0B1-55B4-4C56-B8A8-4DE4B299D3BE}';
  66. FOLDERID_AddNewPrograms : TGUID = '{DE61D971-5EBC-4F02-A3A9-6C82895E5C04}';
  67. FOLDERID_AdminTools : TGUID = '{724EF170-A42D-4FEF-9F26-B60E846FBA4F}';
  68. FOLDERID_AllAppMods : TGUID = '{7AD67899-66AF-43BA-9156-6AAD42E6C596}';
  69. FOLDERID_AppCaptures : TGUID = '{EDC0FE71-98D8-4F4A-B920-C8DC133CB165}';
  70. FOLDERID_AppDataDesktop : TGUID = '{B2C5E279-7ADD-439F-B28C-C41FE1BBF672}';
  71. FOLDERID_AppDataDocuments : TGUID = '{7BE16610-1F7F-44AC-BFF0-83E15F2FFCA1}';
  72. FOLDERID_AppDataFavorites : TGUID = '{7CFBEFBC-DE1F-45AA-B843-A542AC536CC9}';
  73. FOLDERID_AppDataProgramData : TGUID = '{559D40A3-A036-40FA-AF61-84CB430A4D34}';
  74. FOLDERID_AppUpdates : TGUID = '{A305CE99-F527-492B-8B1A-7E76FA98D6E4}';
  75. FOLDERID_ApplicationShortcuts : TGUID = '{A3918781-E5F2-4890-B3D9-A7E54332328C}';
  76. FOLDERID_AppsFolder : TGUID = '{1E87508D-89C2-42F0-8A7E-645A0F50CA58}';
  77. FOLDERID_CDBurning : TGUID = '{9E52AB10-F80D-49DF-ACB8-4330F5687855}';
  78. FOLDERID_CameraRoll : TGUID = '{AB5FB87B-7CE2-4F83-915D-550846C9537B}';
  79. FOLDERID_CameraRollLibrary : TGUID = '{2B20DF75-1EDA-4039-8097-38798227D5B7}';
  80. FOLDERID_ChangeRemovePrograms : TGUID = '{DF7266AC-9274-4867-8D55-3BD661DE872D}';
  81. FOLDERID_CommonAdminTools : TGUID = '{D0384E7D-BAC3-4797-8F14-CBA229B392B5}';
  82. FOLDERID_CommonOEMLinks : TGUID = '{C1BAE2D0-10DF-4334-BEDD-7AA20B227A9D}';
  83. FOLDERID_CommonPrograms : TGUID = '{0139D44E-6AFE-49F2-8690-3DAFCAE6FFB8}';
  84. FOLDERID_CommonStartMenu : TGUID = '{A4115719-D62E-491D-AA7C-E74B8BE3B067}';
  85. FOLDERID_CommonStartMenuPlaces : TGUID = '{A440879F-87A0-4F7D-B700-0207B966194A}';
  86. FOLDERID_CommonStartup : TGUID = '{82A5EA35-D9CD-47C5-9629-E15D2F714E6E}';
  87. FOLDERID_CommonTemplates : TGUID = '{B94237E7-57AC-4347-9151-B08C6C32D1F7}';
  88. FOLDERID_ComputerFolder : TGUID = '{0AC0837C-BBF8-452A-850D-79D08E667CA7}';
  89. FOLDERID_ConflictFolder : TGUID = '{4BFEFB45-347D-4006-A5BE-AC0CB0567192}';
  90. FOLDERID_ConnectionsFolder : TGUID = '{6F0CD92B-2E97-45D1-88FF-B0D186B8DEDD}';
  91. FOLDERID_Contacts : TGUID = '{56784854-C6CB-462B-8169-88E350ACB882}';
  92. FOLDERID_ControlPanelFolder : TGUID = '{82A74AEB-AEB4-465C-A014-D097EE346D63}';
  93. FOLDERID_Cookies : TGUID = '{2B0F765D-C0E9-4171-908E-08A611B84FF6}';
  94. FOLDERID_CurrentAppMods : TGUID = '{3DB40B20-2A30-4DBE-917E-771DD21DD099}';
  95. FOLDERID_Desktop : TGUID = '{B4BFCC3A-DB2C-424C-B029-7FE99A87C641}';
  96. FOLDERID_DevelopmentFiles : TGUID = '{DBE8E08E-3053-4BBC-B183-2A7B2B191E59}';
  97. FOLDERID_Device : TGUID = '{1C2AC1DC-4358-4B6C-9733-AF21156576F0}';
  98. FOLDERID_DeviceMetadataStore : TGUID = '{5CE4A5E9-E4EB-479D-B89F-130C02886155}';
  99. FOLDERID_Documents : TGUID = '{FDD39AD0-238F-46AF-ADB4-6C85480369C7}';
  100. FOLDERID_DocumentsLibrary : TGUID = '{7B0DB17D-9CD2-4A93-9733-46CC89022E7C}';
  101. FOLDERID_Downloads : TGUID = '{374DE290-123F-4565-9164-39C4925E467B}';
  102. FOLDERID_Favorites : TGUID = '{1777F761-68AD-4D8A-87BD-30B759FA33DD}';
  103. FOLDERID_Fonts : TGUID = '{FD228CB7-AE11-4AE3-864C-16F3910AB8FE}';
  104. FOLDERID_GameTasks : TGUID = '{054FAE61-4DD8-4787-80B6-090220C4B700}';
  105. FOLDERID_Games : TGUID = '{CAC52C1A-B53D-4EDC-92D7-6B2E8AC19434}';
  106. FOLDERID_History : TGUID = '{D9DC8A3B-B784-432E-A781-5A1130A75963}';
  107. FOLDERID_HomeGroup : TGUID = '{52528A6B-B9E3-4ADD-B60D-588C2DBA842D}';
  108. FOLDERID_HomeGroupCurrentUser : TGUID = '{9B74B6A3-0DFD-4F11-9E78-5F7800F2E772}';
  109. FOLDERID_ImplicitAppShortcuts : TGUID = '{BCB5256F-79F6-4CEE-B725-DC34E402FD46}';
  110. FOLDERID_InternetCache : TGUID = '{352481E8-33BE-4251-BA85-6007CAEDCF9D}';
  111. FOLDERID_InternetFolder : TGUID = '{4D9F7874-4E0C-4904-967B-40B0D20C3E4B}';
  112. FOLDERID_Libraries : TGUID = '{1B3EA5DC-B587-4786-B4EF-BD1DC332AEAE}';
  113. FOLDERID_Links : TGUID = '{BFB9D5E0-C6A9-404C-B2B2-AE6DB6AF4968}';
  114. FOLDERID_LocalAppData : TGUID = '{F1B32785-6FBA-4FCF-9D55-7B8E7F157091}';
  115. FOLDERID_LocalAppDataLow : TGUID = '{A520A1A4-1780-4FF6-BD18-167343C5AF16}';
  116. FOLDERID_LocalDocuments : TGUID = '{F42EE2D3-909F-4907-8871-4C22FC0BF756}';
  117. FOLDERID_LocalDownloads : TGUID = '{7D83EE9B-2244-4E70-B1F5-5393042AF1E4}';
  118. FOLDERID_LocalMusic : TGUID = '{A0C69A99-21C8-4671-8703-7934162FCF1D}';
  119. FOLDERID_LocalPictures : TGUID = '{0DDD015D-B06C-45D5-8C4C-F59713854639}';
  120. FOLDERID_LocalVideos : TGUID = '{35286A68-3C57-41A1-BBB1-0EAE73D76C95}';
  121. FOLDERID_LocalizedResourcesDir : TGUID = '{2A00375E-224C-49DE-B8D1-440DF7EF3DDC}';
  122. FOLDERID_Music : TGUID = '{4BD8D571-6D19-48D3-BE97-422220080E43}';
  123. FOLDERID_MusicLibrary : TGUID = '{2112AB0A-C86A-4FFE-A368-0DE96E47012E}';
  124. FOLDERID_NetHood : TGUID = '{C5ABBF53-E17F-4121-8900-86626FC2C973}';
  125. FOLDERID_NetworkFolder : TGUID = '{D20BEEC4-5CA8-4905-AE3B-BF251EA09B53}';
  126. FOLDERID_Objects3D : TGUID = '{31C0DD25-9439-4F12-BF41-7FF4EDA38722}';
  127. FOLDERID_OneDrive : TGUID = '{A52BBA46-E9E1-435F-B3D9-28DAA648C0F6}';
  128. FOLDERID_OriginalImages : TGUID = '{2C36C0AA-5812-4B87-BFD0-4CD0DFB19B39}';
  129. FOLDERID_PhotoAlbums : TGUID = '{69D2CF90-FC33-4FB7-9A0C-EBB0F0FCB43C}';
  130. FOLDERID_Pictures : TGUID = '{33E28130-4E1E-4676-835A-98395C3BC3BB}';
  131. FOLDERID_PicturesLibrary : TGUID = '{A990AE9F-A03B-4E80-94BC-9912D7504104}';
  132. FOLDERID_Playlists : TGUID = '{DE92C1C7-837F-4F69-A3BB-86E631204A23}';
  133. FOLDERID_PrintHood : TGUID = '{9274BD8D-CFD1-41C3-B35E-B13F55A758F4}';
  134. FOLDERID_PrintersFolder : TGUID = '{76FC4E2D-D6AD-4519-A663-37BD56068185}';
  135. FOLDERID_Profile : TGUID = '{5E6C858F-0E22-4760-9AFE-EA3317B67173}';
  136. FOLDERID_ProgramData : TGUID = '{62AB5D82-FDC1-4DC3-A9DD-070D1D495D97}';
  137. FOLDERID_ProgramFiles : TGUID = '{905E63B6-C1BF-494E-B29C-65B732D3D21A}';
  138. FOLDERID_ProgramFilesCommon : TGUID = '{F7F1ED05-9F6D-47A2-AAAE-29D317C6F066}';
  139. FOLDERID_ProgramFilesCommonX64 : TGUID = '{6365D5A7-0F0D-45E5-87F6-0DA56B6A4F7D}';
  140. FOLDERID_ProgramFilesCommonX86 : TGUID = '{DE974D24-D9C6-4D3E-BF91-F4455120B917}';
  141. FOLDERID_ProgramFilesX64 : TGUID = '{6D809377-6AF0-444B-8957-A3773F02200E}';
  142. FOLDERID_ProgramFilesX86 : TGUID = '{7C5A40EF-A0FB-4BFC-874A-C0F2E0B9FA8E}';
  143. FOLDERID_Programs : TGUID = '{A77F5D77-2E2B-44C3-A6A2-ABA601054A51}';
  144. FOLDERID_Public : TGUID = '{DFDF76A2-C82A-4D63-906A-5644AC457385}';
  145. FOLDERID_PublicDesktop : TGUID = '{C4AA340D-F20F-4863-AFEF-F87EF2E6BA25}';
  146. FOLDERID_PublicDocuments : TGUID = '{ED4824AF-DCE4-45A8-81E2-FC7965083634}';
  147. FOLDERID_PublicDownloads : TGUID = '{3D644C9B-1FB8-4F30-9B45-F670235F79C0}';
  148. FOLDERID_PublicGameTasks : TGUID = '{DEBF2536-E1A8-4C59-B6A2-414586476AEA}';
  149. FOLDERID_PublicLibraries : TGUID = '{48DAF80B-E6CF-4F4E-B800-0E69D84EE384}';
  150. FOLDERID_PublicMusic : TGUID = '{3214FAB5-9757-4298-BB61-92A9DEAA44FF}';
  151. FOLDERID_PublicPictures : TGUID = '{B6EBFB86-6907-413C-9AF7-4FC2ABF07CC5}';
  152. FOLDERID_PublicRingtones : TGUID = '{E555AB60-153B-4D17-9F04-A5FE99FC15EC}';
  153. FOLDERID_PublicUserTiles : TGUID = '{0482AF6C-08F1-4C34-8C90-E17EC98B1E17}';
  154. FOLDERID_PublicVideos : TGUID = '{2400183A-6185-49FB-A2D8-4A392A602BA3}';
  155. FOLDERID_QuickLaunch : TGUID = '{52A4F021-7B75-48A9-9F6B-4B87A210BC8F}';
  156. FOLDERID_Recent : TGUID = '{AE50C081-EBD2-438A-8655-8A092E34987A}';
  157. FOLDERID_RecordedCalls : TGUID = '{2F8B40C2-83ED-48EE-B383-A1F157EC6F9A}';
  158. FOLDERID_RecordedTVLibrary : TGUID = '{1A6FDBA2-F42D-4358-A798-B74D745926C5}';
  159. FOLDERID_RecycleBinFolder : TGUID = '{B7534046-3ECB-4C18-BE4E-64CD4CB7D6AC}';
  160. FOLDERID_ResourceDir : TGUID = '{8AD10C31-2ADB-4296-A8F7-E4701232C972}';
  161. FOLDERID_RetailDemo : TGUID = '{12D4C69E-24AD-4923-BE19-31321C43A767}';
  162. FOLDERID_Ringtones : TGUID = '{C870044B-F49E-4126-A9C3-B52A1FF411E8}';
  163. FOLDERID_RoamedTileImages : TGUID = '{AAA8D5A5-F1D6-4259-BAA8-78E7EF60835E}';
  164. FOLDERID_RoamingAppData : TGUID = '{3EB685DB-65F9-4CF6-A03A-E3EF65729F3D}';
  165. FOLDERID_RoamingTiles : TGUID = '{00BCFC5A-ED94-4E48-96A1-3F6217F21990}';
  166. FOLDERID_SEARCH_CSC : TGUID = '{EE32E446-31CA-4ABA-814F-A5EBD2FD6D5E}';
  167. FOLDERID_SEARCH_MAPI : TGUID = '{98EC0E18-2098-4D44-8644-66979315A281}';
  168. FOLDERID_SampleMusic : TGUID = '{B250C668-F57D-4EE1-A63C-290EE7D1AA1F}';
  169. FOLDERID_SamplePictures : TGUID = '{C4900540-2379-4C75-844B-64E6FAF8716B}';
  170. FOLDERID_SamplePlaylists : TGUID = '{15CA69B3-30EE-49C1-ACE1-6B5EC372AFB5}';
  171. FOLDERID_SampleVideos : TGUID = '{859EAD94-2E85-48AD-A71A-0969CB56A6CD}';
  172. FOLDERID_SavedGames : TGUID = '{4C5C32FF-BB9D-43B0-B5B4-2D72E54EAAA4}';
  173. FOLDERID_SavedPictures : TGUID = '{3B193882-D3AD-4EAB-965A-69829D1FB59F}';
  174. FOLDERID_SavedPicturesLibrary : TGUID = '{E25B5812-BE88-4BD9-94B0-29233477B6C3}';
  175. FOLDERID_SavedSearches : TGUID = '{7D1D3A04-DEBB-4115-95CF-2F29DA2920DA}';
  176. FOLDERID_Screenshots : TGUID = '{B7BEDE81-DF94-4682-A7D8-57A52620B86F}';
  177. FOLDERID_SearchHistory : TGUID = '{0D4C3DB6-03A3-462F-A0E6-08924C41B5D4}';
  178. FOLDERID_SearchHome : TGUID = '{190337D1-B8CA-4121-A639-6D472D16972A}';
  179. FOLDERID_SearchTemplates : TGUID = '{7E636BFE-DFA9-4D5E-B456-D7B39851D8A9}';
  180. FOLDERID_SendTo : TGUID = '{8983036C-27C0-404B-8F08-102D10DCFD74}';
  181. FOLDERID_SidebarDefaultParts : TGUID = '{7B396E54-9EC5-4300-BE0A-2482EBAE1A26}';
  182. FOLDERID_SidebarParts : TGUID = '{A75D362E-50FC-4FB7-AC2C-A8BEAA314493}';
  183. FOLDERID_SkyDrive : TGUID = '{A52BBA46-E9E1-435F-B3D9-28DAA648C0F6}';
  184. FOLDERID_SkyDriveCameraRoll : TGUID = '{767E6811-49CB-4273-87C2-20F355E1085B}';
  185. FOLDERID_SkyDriveDocuments : TGUID = '{24D89E24-2F19-4534-9DDE-6A6671FBB8FE}';
  186. FOLDERID_SkyDriveMusic : TGUID = '{C3F2459E-80D6-45DC-BFEF-1F769F2BE730}';
  187. FOLDERID_SkyDrivePictures : TGUID = '{339719B5-8C47-4894-94C2-D8F77ADD44A6}';
  188. FOLDERID_StartMenu : TGUID = '{625B53C3-AB48-4EC1-BA1F-A1EF4146FC19}';
  189. FOLDERID_StartMenuAllPrograms : TGUID = '{F26305EF-6948-40B9-B255-81453D09C785}';
  190. FOLDERID_Startup : TGUID = '{B97D20BB-F46A-4C97-BA10-5E3608430854}';
  191. FOLDERID_SyncManagerFolder : TGUID = '{43668BF8-C14E-49B2-97C9-747784D784B7}';
  192. FOLDERID_SyncResultsFolder : TGUID = '{289A9A43-BE44-4057-A41B-587A76D7E7F9}';
  193. FOLDERID_SyncSetupFolder : TGUID = '{0F214138-B1D3-4A90-BBA9-27CBC0C5389A}';
  194. FOLDERID_System : TGUID = '{1AC14E77-02E7-4E5D-B744-2EB1AE5198B7}';
  195. FOLDERID_SystemX86 : TGUID = '{D65231B0-B2F1-4857-A4CE-A8E7C6EA7D27}';
  196. FOLDERID_Templates : TGUID = '{A63293E8-664E-48DB-A079-DF759E0509F7}';
  197. FOLDERID_UserPinned : TGUID = '{9E3995AB-1F9C-4F13-B827-48B24B6C7174}';
  198. FOLDERID_UserProfiles : TGUID = '{0762D272-C50A-4BB0-A382-697DCD729B80}';
  199. FOLDERID_UserProgramFiles : TGUID = '{5CD7AEE2-2219-4A67-B85D-6C9CE15660CB}';
  200. FOLDERID_UserProgramFilesCommon : TGUID = '{BCBD3057-CA5C-4622-B42D-BC56DB0AE516}';
  201. FOLDERID_UsersFiles : TGUID = '{F3CE0F7C-4901-4ACC-8648-D5D44B04EF8F}';
  202. FOLDERID_UsersLibraries : TGUID = '{A302545D-DEFF-464B-ABE8-61C8648D939B}';
  203. FOLDERID_Videos : TGUID = '{18989B1D-99B5-455B-841C-AB7C74E4DDFC}';
  204. FOLDERID_VideosLibrary : TGUID = '{491E922F-5643-4AF4-A7EB-4E7A138D8174}';
  205. FOLDERID_Windows : TGUID = '{F38BF404-1D43-42F2-9305-67DE0B28FC23}';
  206. // KNOWN_FOLDER_FLAG enumeration
  207. const
  208. KF_FLAG_DEFAULT = DWORD(0);
  209. KF_FLAG_CREATE = DWORD($8000);
  210. function GetWindowsSpecialDir(ID: Integer; CreateIfNotExists: Boolean = True): String;
  211. function GetWindowsSpecialDir(const GUID: TGUID; CreateIfNotExists: Boolean = True): String;
  212. function GetWindowsSpecialDirUnicode(ID: Integer; CreateIfNotExists: Boolean = True): UnicodeString;
  213. function GetWindowsSpecialDirUnicode(const GUID: TGUID; CreateIfNotExists: Boolean = True): UnicodeString;
  214. function GetWindowsSystemDirectory: String;
  215. function GetWindowsSystemDirectoryUnicode: UnicodeString;
  216. function ConvertCSIDLtoFOLDERID(CSIDL: Integer; out FOLDERID: TGUID): Boolean;
  217. function ConvertFOLDERIDtoCSIDL(const FOLDERID: TGUID; out CSIDL: Integer): Boolean;
  218. implementation
  219. uses
  220. Windows, SysUtils;
  221. type
  222. TCSIDLtoFOLDERID = record
  223. CSIDL: Integer;
  224. FOLDERID: PGUID;
  225. end;
  226. const
  227. // Mapping of legacy CSIDL_* constants to their appropriate FOLDERID_* counterparts.
  228. CSIDLtoFOLDERID: array [1..40] of TCSIDLtoFOLDERID = (
  229. (CSIDL: CSIDL_PROGRAMS; FOLDERID: @FOLDERID_Programs),
  230. (CSIDL: CSIDL_PERSONAL; FOLDERID: @FOLDERID_Documents),
  231. (CSIDL: CSIDL_FAVORITES; FOLDERID: @FOLDERID_Favorites),
  232. (CSIDL: CSIDL_STARTUP; FOLDERID: @FOLDERID_Startup),
  233. (CSIDL: CSIDL_RECENT; FOLDERID: @FOLDERID_Recent),
  234. (CSIDL: CSIDL_SENDTO; FOLDERID: @FOLDERID_SendTo),
  235. (CSIDL: CSIDL_STARTMENU; FOLDERID: @FOLDERID_StartMenu),
  236. (CSIDL: CSIDL_MYMUSIC; FOLDERID: @FOLDERID_Music),
  237. (CSIDL: CSIDL_MYVIDEO; FOLDERID: @FOLDERID_Videos),
  238. (CSIDL: CSIDL_DESKTOPDIRECTORY; FOLDERID: @FOLDERID_Desktop),
  239. (CSIDL: CSIDL_NETHOOD; FOLDERID: @FOLDERID_NetHood),
  240. (CSIDL: CSIDL_FONTS; FOLDERID: @FOLDERID_Fonts),
  241. (CSIDL: CSIDL_TEMPLATES; FOLDERID: @FOLDERID_Templates),
  242. (CSIDL: CSIDL_COMMON_STARTMENU; FOLDERID: @FOLDERID_CommonStartMenu),
  243. (CSIDL: CSIDL_COMMON_PROGRAMS; FOLDERID: @FOLDERID_CommonPrograms),
  244. (CSIDL: CSIDL_COMMON_STARTUP; FOLDERID: @FOLDERID_CommonStartup),
  245. (CSIDL: CSIDL_COMMON_DESKTOPDIRECTORY; FOLDERID: @FOLDERID_PublicDesktop),
  246. (CSIDL: CSIDL_APPDATA; FOLDERID: @FOLDERID_RoamingAppData),
  247. (CSIDL: CSIDL_PRINTHOOD; FOLDERID: @FOLDERID_PrintHood),
  248. (CSIDL: CSIDL_LOCAL_APPDATA; FOLDERID: @FOLDERID_LocalAppData),
  249. (CSIDL: CSIDL_COMMON_FAVORITES; FOLDERID: @FOLDERID_Favorites),
  250. (CSIDL: CSIDL_INTERNET_CACHE; FOLDERID: @FOLDERID_InternetCache),
  251. (CSIDL: CSIDL_COOKIES; FOLDERID: @FOLDERID_Cookies),
  252. (CSIDL: CSIDL_HISTORY; FOLDERID: @FOLDERID_History),
  253. (CSIDL: CSIDL_COMMON_APPDATA; FOLDERID: @FOLDERID_ProgramData),
  254. (CSIDL: CSIDL_WINDOWS; FOLDERID: @FOLDERID_Windows),
  255. (CSIDL: CSIDL_SYSTEM; FOLDERID: @FOLDERID_System),
  256. (CSIDL: CSIDL_PROGRAM_FILES; FOLDERID: @FOLDERID_ProgramFiles),
  257. (CSIDL: CSIDL_MYPICTURES; FOLDERID: @FOLDERID_Pictures),
  258. (CSIDL: CSIDL_PROFILE; FOLDERID: @FOLDERID_Profile),
  259. (CSIDL: CSIDL_PROGRAM_FILES_COMMON; FOLDERID: @FOLDERID_ProgramFilesCommon),
  260. (CSIDL: CSIDL_COMMON_TEMPLATES; FOLDERID: @FOLDERID_CommonTemplates),
  261. (CSIDL: CSIDL_COMMON_DOCUMENTS; FOLDERID: @FOLDERID_PublicDocuments),
  262. (CSIDL: CSIDL_COMMON_ADMINTOOLS; FOLDERID: @FOLDERID_CommonAdminTools),
  263. (CSIDL: CSIDL_ADMINTOOLS; FOLDERID: @FOLDERID_AdminTools),
  264. (CSIDL: CSIDL_COMMON_MUSIC; FOLDERID: @FOLDERID_PublicMusic),
  265. (CSIDL: CSIDL_COMMON_PICTURES; FOLDERID: @FOLDERID_PublicPictures),
  266. (CSIDL: CSIDL_COMMON_VIDEO; FOLDERID: @FOLDERID_PublicVideos),
  267. (CSIDL: CSIDL_CDBURN_AREA; FOLDERID: @FOLDERID_CDBurning),
  268. (CSIDL: CSIDL_PROFILES; FOLDERID: @FOLDERID_UserProfiles)
  269. );
  270. // CoTaskMemFree is required for the use of SHGetKnownFolderPath function.
  271. // CoTaskMemFree function signature was copied from ActiveX unit.
  272. procedure CoTaskMemFree(_para1:PVOID); stdcall; external 'ole32.dll' name 'CoTaskMemFree';
  273. type
  274. KNOWNFOLDERID = TGUID;
  275. PWSTR = PWideChar;
  276. type
  277. // HRESULT SHGetFolderPath(
  278. // _In_ HWND hwndOwner,
  279. // _In_ int nFolder,
  280. // _In_ HANDLE hToken,
  281. // _In_ DWORD dwFlags,
  282. // _Out_ LPTSTR pszPath
  283. // );
  284. // DLL: Shell32.dll (version 5.0 or later)
  285. // OS: Windows 2000 and newer
  286. TSHGetFolderPathW = function(Ahwnd: HWND; Csidl: Integer; Token: THandle;
  287. Flags: DWORD; Path: PWideChar): HRESULT; stdcall;
  288. // HRESULT SHGetKnownFolderPath(
  289. // _In_ REFKNOWNFOLDERID rfid,
  290. // _In_ DWORD dwFlags,
  291. // _In_opt_ HANDLE hToken,
  292. // _Out_ PWSTR *ppszPath
  293. // );
  294. // DLL: Shell32.dll (version 6.0.6000 or later)
  295. // OS: Windows Vista / Server 2008 and newer
  296. TSHGetKnownFolderPathW = function(const rfid: KNOWNFOLDERID; dwFlags: DWORD;
  297. hToken: THandle; out ppszPath: PWSTR): HRESULT; stdcall;
  298. const
  299. SSHGetFolderPathW = 'SHGetFolderPathW';
  300. SSHGetKnownFolderPathW = 'SHGetKnownFolderPath';
  301. SLibName = 'shell32.dll';
  302. var
  303. _SHGetFolderPathW : TSHGetFolderPathW = nil;
  304. _SHGetKnownFolderPathW: TSHGetKnownFolderPathW = nil;
  305. DLLHandle: THandle = 0;
  306. procedure InitDLL;
  307. var
  308. DLLPath: UnicodeString;
  309. begin
  310. if DLLHandle = 0 then
  311. begin
  312. // Load DLL using a full path, in order to prevent spoofing (Mantis #18185)
  313. DLLPath := GetWindowsSystemDirectoryUnicode;
  314. if Length(DLLPath) > 0 then
  315. begin
  316. DLLPath := IncludeTrailingPathDelimiter(DLLPath) + SLibName;
  317. DLLHandle := LoadLibraryW(PWideChar(DLLPath));
  318. if DLLHandle <> 0 then
  319. begin
  320. Pointer(_SHGetFolderPathW) := GetProcAddress(DLLHandle, SSHGetFolderPathW);
  321. Pointer(_SHGetKnownFolderPathW) := GetProcAddress(DLLHandle, SSHGetKnownFolderPathW);
  322. end;
  323. end;
  324. end;
  325. // At least one of SHGetFolderPath or SHGetKnownFolderPath functions is required
  326. if (@_SHGetFolderPathW = nil) and (@_SHGetKnownFolderPathW = nil) then
  327. raise Exception.Create('Could not locate '+SSHGetFolderPathW+' / '+SSHGetKnownFolderPathW+' functions');
  328. end;
  329. procedure FinitDLL;
  330. begin
  331. if DLLHandle <> 0 then
  332. begin
  333. FreeLibrary(DLLHandle);
  334. DLLHandle := 0;
  335. end;
  336. end;
  337. function GetWindowsSystemDirectoryUnicode: UnicodeString;
  338. var
  339. Buffer: array [0..MAX_PATH] of WideChar;
  340. CharCount: Integer;
  341. begin
  342. CharCount := GetSystemDirectoryW(@Buffer[0], MAX_PATH);
  343. // CharCount is length in TCHARs not including the terminating null character.
  344. // If result did not fit, CharCount will be bigger than buffer size.
  345. if (CharCount > 0) and (CharCount < MAX_PATH) then
  346. Result := StrPas(Buffer)
  347. else
  348. Result := '';
  349. end;
  350. function GetWindowsSystemDirectory: String;
  351. begin
  352. Result := String(GetWindowsSystemDirectoryUnicode);
  353. end;
  354. function GetWindowsSpecialDirUnicode(ID: Integer; CreateIfNotExists: Boolean = True): UnicodeString;
  355. var
  356. Buffer: array [0..MAX_PATH] of WideChar;
  357. FOLDERID: TGUID;
  358. begin
  359. InitDLL;
  360. Result := '';
  361. if @_SHGetFolderPathW = nil then
  362. begin
  363. if ConvertCSIDLtoFOLDERID(ID, FOLDERID) then
  364. Result := GetWindowsSpecialDirUnicode(FOLDERID, CreateIfNotExists);
  365. end
  366. else
  367. begin
  368. if CreateIfNotExists then
  369. ID := ID or CSIDL_FLAG_CREATE;
  370. if _SHGetFolderPathW(0, ID, 0, 0, @Buffer[0]) = S_OK then
  371. Result := IncludeTrailingPathDelimiter(StrPas(Buffer));
  372. end;
  373. end;
  374. function GetWindowsSpecialDirUnicode(const GUID: TGUID; CreateIfNotExists: Boolean = True): UnicodeString;
  375. var
  376. Flags: DWORD;
  377. Path: PWSTR;
  378. CSIDL: Integer;
  379. begin
  380. InitDLL;
  381. Result := '';
  382. if @_SHGetKnownFolderPathW = nil then
  383. begin
  384. if ConvertFOLDERIDtoCSIDL(GUID, CSIDL) then
  385. Result := GetWindowsSpecialDirUnicode(CSIDL, CreateIfNotExists);
  386. end
  387. else
  388. begin
  389. Path := nil;
  390. Flags := KF_FLAG_DEFAULT;
  391. if CreateIfNotExists then
  392. Flags := Flags or KF_FLAG_CREATE;
  393. if _SHGetKnownFolderPathW(GUID, Flags, 0, Path) = S_OK then
  394. begin
  395. Result := StrPas(Path);
  396. CoTaskMemFree(Path);
  397. end;
  398. end;
  399. end;
  400. function GetWindowsSpecialDir(ID: Integer; CreateIfNotExists: Boolean = True): String;
  401. begin
  402. Result := String(GetWindowsSpecialDirUnicode(ID, CreateIfNotExists));
  403. end;
  404. function GetWindowsSpecialDir(const GUID: TGUID; CreateIfNotExists: Boolean = True): String;
  405. begin
  406. Result := String(GetWindowsSpecialDirUnicode(GUID, CreateIfNotExists));
  407. end;
  408. function ConvertCSIDLtoFOLDERID(CSIDL: Integer; out FOLDERID: TGUID): Boolean;
  409. var
  410. I: Integer;
  411. begin
  412. Result := False;
  413. for I := Low(CSIDLtoFOLDERID) to High(CSIDLtoFOLDERID) do
  414. begin
  415. if CSIDLtoFOLDERID[I].CSIDL = CSIDL then
  416. begin
  417. if CSIDLtoFOLDERID[I].FOLDERID <> nil then
  418. begin
  419. FOLDERID := CSIDLtoFOLDERID[I].FOLDERID^;
  420. Result := True;
  421. Break;
  422. end
  423. else
  424. Break;
  425. end;
  426. end;
  427. end;
  428. function ConvertFOLDERIDtoCSIDL(const FOLDERID: TGUID; out CSIDL: Integer): Boolean;
  429. var
  430. I: Integer;
  431. begin
  432. Result := False;
  433. for I := Low(CSIDLtoFOLDERID) to High(CSIDLtoFOLDERID) do
  434. begin
  435. if CSIDLtoFOLDERID[I].FOLDERID <> nil then
  436. begin
  437. if IsEqualGUID(CSIDLtoFOLDERID[I].FOLDERID^, FOLDERID) then
  438. begin
  439. CSIDL := CSIDLtoFOLDERID[I].CSIDL;
  440. Result := True;
  441. Break;
  442. end;
  443. end;
  444. end;
  445. end;
  446. finalization
  447. FinitDLL;
  448. end.