Подписка

добавить на Яндекс

Наши проекты

Delphi+Google

Google API

Google API в Delphi - проект с открытым исходным кодом.

Chrono

Chrono

Хронометр - программа для ведения списка задач.

ODFProc

ODFProc

ODFProc - работа с документами OpenOffice в Lazarus и FreePascal.

Поддержка блога

А тут я коплю на лицензию Delphi XE на iPad =).
Сумма пожертвования не фиксирована.

Публикации

Год назад

Случайный пост

Последние

Сообщения форума

Комментарии

Свежие комментарии

Социальные сети

Google

Facebook

Twitter

Опрос

Вы сейчас или в ближайшем обозримом будущем планируете разрабатывать кроссплатформенное приложение с использованием Firemonkey?



Loading ... Loading ...

Блоги и сообщества

Статьи по Delphi DelphiFeeds.ru - Все Delphi-блоги Рунета Сообщество умных людей VR-Online.RU Бесплатный журнал для программистов и всех, кто интересуется IT Статьи и уроки по Delphi Новостной блог о высоких технологиях
Система Orphus
Опубликовал Vlad 25 февраля 2010 в 16:33.
Категории: Основы Delphi.


Сегодня рассмотрим ещё один простой способ определения специальных папок Windows. К специальным относятся такие директории как, например:  "Мои документы", "Application Data", "Cookies" и т.д. В разное время развития операционной системы Windows, как и в разное время развития Delphi предлагалась масса различных способов определения путей к специальным директориям от самых простых - использование GetWindowsDirectory до таких "экзотических" как работа с интерфейсом ISHFolder и т.д.

Сегодня расмотрим более простой, на мой взгляд, способ получения всех без исключения системных папок. При этом мы воспользуемся всего одним заголовочным модулем Delphi - SHFolder.pas. Этот модуль содержит необходимы типы данных и константы для работы с библиотекой shfolder.dll, которая доступна во всех версиях Windows, начиная с Win95.

В начале немного теории. В модуле SHFolder.pas вы найдете всего одну функцию - SHGetFolderPath. Функция  получает путь к папке, определенной значением CSIDL. Следует отметить, что её не рекомендуется использовать в Windows Vista и выше, т.к. в бибилотеках ОС Win Vista и Windows 7 эта функция осталась только для обратной совместимости. Вместо этого рекоммендуется использовать функцию SHGetKnownFolderPath, которая, кстати сказать, по большому счёты не отличается от своей предшественницы. Т.к. я использую в работе только ОС Win XP, то для меня вполне хватит и обычной SHGetFolderPath.

Функция имеет следующее описание:

function(hwnd: HWND; csidl: Integer; hToken: THandle; dwFlags: DWord; pszPath: PAnsiChar): HRESULT;

Первый параметр hwnd - зарезервирован и не используется. При вызове функции достаточно присвоить ему значение 0.
csidl- определяет путь к какой директории мы хотим получить. Параметр может принимать следующие значения:

Константа Значение Путь к директории по умолчанию
CSIDL_PERSONAL $0005 C:\Documents and Settings\%User%\Мои
документы
CSIDL_APPDATA $001A C:\Documents and Settings\%User%\Application
Data
CSIDL_LOCAL_APPDATA $001C C:\Documents and Settings\%User%\Local
Settings\Application Data
CSIDL_MYMUSIC $000d C:\Documents and Settings\%User%\Мои
документы\Моя музыка
CSIDL_INTERNET_CACHE $0020 C:\Documents and Settings\%User%\Local
Settings\Temporary Internet Files
CSIDL_COOKIES $0021 C:\Documents and Settings\%User%\Cookies
CSIDL_HISTORY $0022 C:\Documents and Settings\%User%\Local
Settings\History
CSIDL_COMMON_APPDATA $0023 C:\Documents and Settings\All Users\Application Data
CSIDL_WINDOWS $0024 C:\WINDOWS
CSIDL_SYSTEM $0025 C:\WINDOWS\system32
CSIDL_PROGRAM_FILES $0026 C:\Program Files
CSIDL_MYPICTURES $0027 C:\Documents and Settings\%User%\Мои
документы\Мои рисунки
CSIDL_PROGRAM_FILES_COMMON $002b C:\Program Files\Common Files
CSIDL_COMMON_DOCUMENTS $002e C:\Documents and Settings\All Users\Документы
CSIDL_RESOURCES $0038 C:\WINDOWS\resources
CSIDL_RESOURCES_LOCALIZED $0039 C:\WINDOWS\resources\%LangID%
CSIDL_COMMON_ADMINTOOLS $002f C:\Documents and Settings\All Users\Главное меню\Программы\Администрирование
CSIDL_ADMINTOOLS $0030 C:\Documents and Settings\Главное меню\Программы\Администрирование

Параметр можно использовать совместно с флагом CSIDL_FLAG_CREATE (для версий Win 2k и выше). В этом случае, если заданная в параметре csidl директория не будет найдена, то функция автоматически её создаст и вернет путь по умолчанию.
hToken - маркер доступа. Для версий Windows 2000 и ниже всегда приравниваеся к NULL, для остальных версий может принимать ненудевое значение.
dwFlags - определяет какой путь будет возвращен функцией: по умолчанию или текущий. Соответственно, может принимать всего два значения: SHGFP_TYPE_DEFAULT и SHGFP_TYPE_CURRENT.
pszPath - указатель на строку WideChar.

Небольшой пример использования SHGetFolderPath. В первом случае мы попробуем получить путь к папке "Мои документы", а во втором - к папке с локализованными ресурсами. При этом, во втором случае, если путь не будет найден, то создадим необходимую директорию:
1. Как получить путь к папке "Мои документы"

var buf: array [1..MAX_PATH] of widechar;
begin
  Memo1.Lines.Clear;
  if Succeeded(SHGetFolderPath(0,CSIDL_PERSONAL,0,SHGFP_TYPE_CURRENT,@buf)) then
    Memo1.Lines.Add(buf);
end;

Результат выполнения функции:

C:\Documents and Settings\%User%\Мои документы

2. Как получить путь к папке с локализованными ресурсами или создать её, вернув путь по умолчанию

var buf: array [1..MAX_PATH] of widechar;
begin
  Memo1.Lines.Clear;
  if Succeeded(SHGetFolderPath(0,CSIDL_RESOURCES_LOCALIZED or  CSIDL_FLAG_CREATE,0,SHGFP_TYPE_CURRENT,@buf)) then
    Memo1.Lines.Add(buf);
end;

Результат выполнения функции:

C:\WINDOWS\resources\419

Аналогичным образом можно получать/создавать другие специальные директории Windows. По-моему рассмотреный выше вариант получения путей вполне приемлим для работы в ОС до Windows Vista. Ну, а если нужна поддержка более поздних версий, то тут уже надо использовать последние версии библиотеки и, вдимо, придётся использовать интерфейс ISHFolder.

-----------------------------
Если вас интересуют услуги по продвижению сайта - обратитесь к SEOдоктору. SEOdoctor.ru - всегда держит руку на пульсе!

Надоело каждый раз качать новую версию аськи для своего мобильника только потому, что у знакомого "смайлы круче"? Собери icq для мобильного в конструкторе аськи за 5 минут, подбери смайлы, заставки и т.д.

Помнится был случай, когда в мой блог пришел пользователь по запросу Трубы и провел здесь в поисках стальных труб порядка 15 минут :) Теперь все в поряке - трубы на месте.
-----------------------------
Понравилась статья? Тогда:
Делись! Загружай! Плюсуй!
   Отправить PDF на   
Читай ещё статьи на WebDelphi.ru

Комментарии (4)

WP_Cloudy

Ваш ответ

Внимание: Все комментарии модерируются, и это может вызвать задержку их публикации. Отправлять комментарий заново не требуется.

Пожалуйста, заключайте исходный код в тэги [code][/code].
Если код большой, то воспользуйтесь Вставкой кода на отдельной странице и оставьте в комментарии ссылку на исходник

   


Подарила парню вот это: туалетная вода Issey Miyake L'eau Bleue D'issey! Довольна --|--. Забавные и прикольные картинки котят