windirs.pp 28 KB

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