Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как найти путь к "Моим документам"? [D7, Win95/98, WinME, NT4, Win2k, WinXP]


ЁПРСТ ©   (2004-05-19 11:36:00) 

Какой функцией, имеется в виду, можно определить виндовскую переменную, которая хранит все эти: "C:\Doc&Set\Admin\My Doc" или "C:\Мои доки"?


GuAV   (2004-06-22 23:36:00) [1]

GetSpecialFolderPath - и никого освобождать не надо.


Игорь   (2004-06-22 19:01:00) [2]

ДА считай из реестра и не фиг ничего выделять и никто виноват не будет


Ajax   (2004-05-19 18:28:00) [3]

А еще можно из реестра взять (по всей видимости приведенная выше API функции именно это и делает). Смотри HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders - там много ключей интересных.


Romkin   (2004-05-19 12:12:00) [4]

ЁПРСТ  (19.05.04 12:08) [5] либо в ShellAPI, либо в ShlObj, не помню. А, точно, uses ShlObj надо


Romkin   (2004-05-19 12:10:00) [5]

Тимохов ©  (19.05.04 11:55) [3] Это не совсем забывчивость :) Дело в том, что в Windows SDK злостно опущена последняя строка, которая есть в msdn... И именно о том, что вызывающее SHGetSpecialFolderLocation приложение обязано освободить память, занятую PItemIDList.
Отсюда и отсутствие free, я сам поймался :(


ЁПРСТ   (2004-05-19 12:08:00) [6]

А еще ламерский вопрос можно? :( (Ну не работал я с API). В каком модуле эти процедуры находятся? Т.е. что в Units подключать надо, чтобы все заработало?


Тимохов   (2004-05-19 12:03:00) [7]

вернее, забыл проверить пример из сети.
ЗЫ: все надо проверять!
ЗЫЫ: это так - попытка обелить себя в глазах общественности :)))


Тимохов   (2004-05-19 11:55:00) [8]


> Romkin ©   (19.05.04 11:48) [2]

Результат string - так, что все ок:
Result := PChar(@kBuf[0]);
004AFED6 8BC3             mov eax,ebx
004AFED8 8D542404         lea edx,[esp+$04]
004AFEDC E8174AF5FF       call @LStrFromPChar

Про освобождение - спасибо, забыл :(((


Romkin   (2004-05-19 11:48:00) [9]

Тимохов ©  (19.05.04 11:39) [1] Поубывав бы. А память под kPIDL кто освобождать будет?! Результат, у тебя, случайно не PChar?!!!
"Тихий" вариант:
function GetMyDocuments: string;
var
 pidl: PItemIDList;
 path: array[0..MAX_PATH] of char;
 Alloc: IMalloc;
begin
 Result := '';
 if SHGetSpecialFolderLocation(0,CSIDL_PERSONAL,pidl) = 0 then
 try
   if SHGetPathFromIDList(pidl,path) then
     Result := path;
 finally
   if succeeded(SHGetMalloc(Alloc)) then
     Alloc.Free(pidl);
 end;
end;


Тимохов   (2004-05-19 11:39:00) [10]

VAR
  kBuf: array [0..MAX_PATH] of Char;
  kPIDL: PItemIDList;
BEGIN
  SHGetSpecialFolderLocation(0, CSIDL_PERSONAL, kPIDL);
  SHGetPathFromIDList(kPIDL,@kBuf[0]);
  Result := PChar(@kBuf[0]);
END;


Наверх

Титульная страница Поиск, карта сайта Написать письмо