![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как найти путь к "Моим документам"? [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;