Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.07.08;
Скачать: CL | DM;

Вниз

Как получить путь с спецпапкам?   Найти похожие ветки 

 
TStas ©   (2007-05-06 20:22) [0]

Например, "Мои документы" или "Рабочий стол", чтобы файловым диалогам InitialDir присвоить


 
begin...end ©   (2007-05-06 20:45) [1]

SHGetSpecialFolderPath


 
DVM ©   (2007-05-06 21:24) [2]

RootKey = HKEY_CURRENT_USER;
Key = "SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders";

Но начиная с Vista Microsoft настоятельно рекомендует SHGetSpecialFolderPath (которая впрочем есть не во всех предыдущих версиях вин.), даже в указанном разделе реестра создала ключ с сообщением, мол юзайте функцию, не читайте значения ключей напрямую :)


 
Dmitrij_K   (2007-05-06 21:50) [3]


> SHGetSpecialFolderPath (которая впрочем есть не во всех
> предыдущих версиях вин.),

???
Minimum operating systems Windows 2000, Windows NT 4.0 with Internet Explorer 4.0, Windows 98, Windows 95 with Internet Explorer 4.0

вполне достаточно


 
DVM ©   (2007-05-06 21:54) [4]


> вполне достаточно

Кому как.


 
Belorus ©   (2007-05-06 22:17) [5]

> [4] DVM ©   (06.05.07 21:54)

Поясни .
Тебе нужна Windows 3.1 ?


 
DVM ©   (2007-05-06 22:29) [6]


> Тебе нужна Windows 3.1 ?

Мне не нужна, но вот программы мои иногда запускают и под Win95OSR2 и под NT4 иногда и без сервис паков и прочее.

По крайней мере надо быть хотя бы в курсе под какой версий вин какие проблемы будут.


 
TStas ©   (2007-05-07 16:18) [7]

>SHGetSpecialFolderPath //А она в каком модуле живет?


 
Reindeer Moss Eater ©   (2007-05-07 16:22) [8]

А она в каком модуле живет?

А поиск файлов *.pas, содержащих SHGetSpecialFolderPath что говорит?


 
TStas ©   (2007-05-07 17:43) [9]

Спасибо. Через чтение реестра сделал и, для удобства, написал объект.


 
Darvin ©   (2007-05-08 10:13) [10]

Попытался использовать функцию SHGetSpecialFolderPath. Сделал так:

unit Unit1;

interface

uses
 ...

const
 Shell32 = "shell32.dll";
 CSIDL_APPDATA = $001A;

{$EXTERNALSYM SHGetSpecialFolderPath}
function SHGetSpecialFolderPath ( hwndOwner : THandle;
                                 lpszPath  : PChar;
                                 nFolder   : Integer;
                                 fCreate   : Boolean ) : Boolean; stdcall;

implementation

function SHGetSpecialFolderPath; external Shell32 name "SHGetSpecialFolderPath";

...

var
 Path : PChar;

begin
 ...
 Path := StrAlloc ( 256 );
 SHGetSpecialFolderPath ( 0, Path, CSIDL_APPDATA, false );
 Label1.Caption := Path;
 ...
end;

При запуске возникает ошибка:
"Точка входа в процедуру SHGetSpecialFolderPath не найдена в библиотеке Dll shell32.dll".
Что я не так делаю? У меня WinXP SP1
Описание брал отсюда:
http://msdn2.microsoft.com/en-us/library/ms647816.aspx


 
DVM ©   (2007-05-08 10:21) [11]

function GetSpecialFolderPath(id: integer): string;
type
 TSHGetSpecialFolderPath = function(hwndOwner: HWND; lpszPath: PChar; nFolder: Integer; fCreate: BOOL): BOOL; stdcall;
var
 Path: array[0..MAX_PATH] of char;
 SHGetSpecialFolderPath: TSHGetSpecialFolderPath;
begin
 result := "";
 ZeroMemory(@Path, SizeOf(Path));
 if (hShell32 > 0) then
   begin
     @SHGetSpecialFolderPath := GetProcAddress(hShell32, "SHGetSpecialFolderPathA");
     if Assigned(SHGetSpecialFolderPath) then
       begin
         SHGetSpecialFolderPath(0, Path, id, false);
         result := AddSlash(path);
       end;
   end;
end;


. . .

initialization

 hShell32 := LoadLibrary("shell32.dll");

finalization

 FreeLibrary(hShell32);


 
DVM ©   (2007-05-08 10:24) [12]


> Darvin ©   (08.05.07 10:13) [10]

Там есть с A и W на конце функции просто SHGetSpecialFolderPath нет


 
Darvin ©   (2007-05-08 10:27) [13]

ясно, спасибо :-)


 
begin...end ©   (2007-05-08 10:29) [14]

uses ShlObj


 
Reindeer Moss Eater ©   (2007-05-08 10:29) [15]

надо прочитать параграф remаrks


 
Darvin ©   (2007-05-08 12:05) [16]

>begin...end ©   (08.05.07 10:29) [14]
Спасибо, получилось :-)


 
Darvin ©   (2007-05-08 14:41) [17]

Еще один вопрос, а как корректно с точки зрения виндовс определить путь к папкам Program Files и Common Files? Только ли, читая реестр?


 
begin...end ©   (2007-05-08 15:40) [18]

> Darvin ©   (08.05.07 14:41) [17]

Можно с помощью всё той же SHGetSpecialFolderPath, но для этого потребуется самостоятельно объявить соответствующие константы:

const
 CSIDL_PROGRAM_FILES = $0026;
 CSIDL_PROGRAM_FILES_COMMON = $002B;

А можно получить эти пути как переменные среды -- вызвать GetEnvironmentVariable (SysUtils) с параметрами "PROGRAMFILES" и "COMMONPROGRAMFILES".

Однако, оба способа будут работать далеко не во всех версиях Windows -- только в относительно новых. В XP работают.


 
Darvin ©   (2007-05-08 15:57) [19]

спасибо


 
TStas ©   (2007-05-09 00:36) [20]

А не в ХР в реестре по тому же адресу живут пути к спецпапкам?


 
DVM ©   (2007-05-09 18:03) [21]


> А не в ХР в реестре по тому же адресу живут пути к спецпапкам?

Да. Но в Viste уже появилось предупреждение насчет реестра, а это может означать что потом ключи могут и поменяться/исчезнуть.


 
Darvin ©   (2007-05-10 15:21) [22]

>TStas ©   (09.05.07 00:36) [20]
под 98 работает прямое чтение из реестра, а начиная с XP следует применять указанные функции



Страницы: 1 вся ветка

Текущий архив: 2007.07.08;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.014 c
15-1181237054
vch
2007-06-07 21:24
2007.07.08
В два раза больше - можно?


15-1181069898
Суслик
2007-06-05 22:58
2007.07.08
Кто пользует PayPal?


2-1181717913
Dr H
2007-06-13 10:58
2007.07.08
TValueListEditor


15-1181030250
_uw_
2007-06-05 11:57
2007.07.08
Я сделал открытие!


1-1178605825
iviom
2007-05-08 10:30
2007.07.08
Удаление всех колонок из DBGridEh