Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Как узнать где папка "Мои документы" или как перевести пример с delphi / 13 сообщений из 13, страница 1 из 1
20.12.2007, 14:00
    #35023280
CTAC-KO
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать где папка "Мои документы" или как перевести пример с delphi
Привет!

Хочется узнать где у текущего юзера находится папка "Мои документы". Роясь в гугле по этому поводу нашел такой пример, но для Delphi :
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
Windows, WinAPI  Узнать пути к стандартным папкам
Написал Snowy    
 09 . 09 . 2007  
В Windows есть специальная функция, позволяющая получить пути к стандартным папкам.
В Delphi это будет выглядеть так: 
uses ShlObj;
 
function GetSpecialPath(CSIDL: word): string;
var s:  string;
begin
  SetLength(s, MAX_PATH);
  if not SHGetSpecialFolderPath( 0 , PChar(s), CSIDL, true)
  then s := '';
  result := PChar(s);
end;
Функции нужно передать id папки, путь которой хотим получить. Список id идёт далее.
Следует помнить, что не все id будуть работать в разных версиях Windows. Например папки 'Documents & Settungs' нет в  98 -х и бессмысленно пытаться получить путь к ней.
Смысл данного поста скорее не в том, чтобы показать, как пользоваться функцией SHGetSpecialFolderPath, а, скорее, дать перечень CSIDL и описание к ним на русском. 

Вот полный код: 
uses ShlObj;
 
const
{
  // Следующие идентификаторы имеются в модуле ShlObj:
  CSIDL_DESKTOP                       = $ 0000 ;
  // Виртуальный каталог, представляющий Рабочий стол. (Корень в проводнике)
  CSIDL_INTERNET                      = $ 0001 ;
  // Виртуальный каталог для Internet Explorer.
  CSIDL_PROGRAMS                      = $ 0002 ;
  // Меню Пуск -> Программы
  CSIDL_CONTROLS                      = $ 0003 ;
  // Виртуальный каталог, содержащий иконки пунктов панели управления
  CSIDL_PRINTERS                      = $ 0004 ;
  // Виртуальный каталог, содержащий установленные принтеры
  CSIDL_PERSONAL                      = $ 0005 ;
  // Виртуальный каталог, представляющий папку "Мои документы"
  // До Vista ссылался на какталог "Мои документы" на жёстком диске
  CSIDL_FAVORITES                     = $ 0006 ;
  // Избранное. (обычно C:\Documents and Settings\username\Favorites)
  CSIDL_STARTUP                       = $ 0007 ;
  // Пуск -> Программы -> Автозагрузка
  CSIDL_RECENT                        = $ 0008 ;
  // Недавние документы (обычно C:\Documents and Settings\username\My Recent Documents
  // Для добавления ссылки документа используйте SHAddToRecentDocs
  CSIDL_SENDTO                        = $ 0009 ;
  // Папка, содержащая ярлыки меню "Отправить" (Sent to...) (обычно C:\Documents and Settings\username\SendTo)
  CSIDL_BITBUCKET                     = $000a;
  // Виртуальный каталог, содержащий файлы в корзине текущего пользователя
  CSIDL_STARTMENU                     = $000b;
  // Элементы меню Пуск текущего пользователя (обычно C:\Documents and Settings\username\Start Menu)
  CSIDL_DESKTOPDIRECTORY              = $ 0010 ;
  // Рабочий стол текущего пользователя (обычно C:\Documents and Settings\username\Desktop)
  CSIDL_DRIVES                        = $ 0011 ;
  // Виртуальный каталог, представляющий папку "Мой компьютер"
  CSIDL_NETWORK                       = $ 0012 ;
  // Виртуальный каталог, представляющий "Сетевое окружение"
  CSIDL_NETHOOD                       = $ 0013 ;
  // Папка "My Nethood Places" (обычно C:\Documents and Settings\username\NetHood)
  // В неё ссылки на избранные расшаренные ресурсы
  CSIDL_FONTS                         = $ 0014 ;
  // Папка, содержащая установленные шрифты. (обычно C:\Windows\Fonts)
  CSIDL_TEMPLATES                     = $ 0015 ;
  // Шаблоны документов. (Обычно Settings\username\Templates)
  CSIDL_COMMON_STARTMENU              = $ 0016 ;
  // Элементы меню Пуск для всех пользователей. (обычно C:\Documents and Settings\All Users\Start Menu)
  // Константы, начинающиеся на CSIDL_COMMON_ существуют только в NT версиях
  CSIDL_COMMON_PROGRAMS               = $ 0017 ;
  // Меню Пуск -> программы для всех пользователей (обычно C:\Documents and Settings\All Users\Start Menu\Programs)
  CSIDL_COMMON_STARTUP                = $ 0018 ;
  // Меню Пуск -> Программы -> Автозагрузка для всех пользователей (обычно C:\Documents and Settings\All Users\Start Menu\Programs\Startup)
  CSIDL_COMMON_DESKTOPDIRECTORY       = $ 0019 ;
  // Элементы Рабочего стола для всех пользователей (обычно C:\Documents and Settings\All Users\Desktop)
  CSIDL_APPDATA                       = $001a;
  // Папка, в которой рограммы должны хранить свои данные(C:\Documents and Settings\username\Application Data)
  CSIDL_PRINTHOOD                     = $001b;
  // Установленные принтеры. (обычно C:\Documents and Settings\username\PrintHood)
  CSIDL_ALTSTARTUP                = $001d;         // DBCS
  // user's nonlocalized Startup program group. Устарело.
  CSIDL_COMMON_ALTSTARTUP         = $001e;         // DBCS
  // Устарело
  CSIDL_COMMON_FAVORITES          = $001f;
  // Ссылки "Избранное" для всех пользователей
  CSIDL_INTERNET_CACHE            = $ 0020 ;
  // Временные Internet файлы (обычно C:\Documents and Settings\username\Local Settings\Temporary Internet Files)
  CSIDL_COOKIES                   = $ 0021 ;
  // Папка для хранения Cookies (обычно C:\Documents and Settings\username\Cookies)
  CSIDL_HISTORY                   = $ 0022 ;
  // Хранит ссылки интернет истории IE
}
Мож кто знает как это на vfp запустить?
...
Рейтинг: 0 / 0
20.12.2007, 14:36
    #35023445
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать где папка "Мои документы" или как перевести пример с delphi
В реестре HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders
параметр Desktop
...
Рейтинг: 0 / 0
20.12.2007, 14:48
    #35023505
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать где папка "Мои документы" или как перевести пример с delphi
Извини, с рабочим столом перепутал.
Там же параметр Personal
...
Рейтинг: 0 / 0
20.12.2007, 15:20
    #35023640
Jurisfox
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать где папка "Мои документы" или как перевести пример с delphi
Можно с помощью WScript - он прочитает данные из реестра:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
? show_MDP("administrator")
RETURN

PROCEDURE show_MDP

LPARAMETERS lpcUserName
lpcUserName=LOWER(lpcUserName)
Local ;
   loWshShell As WScript.Shell, ;
   loSpecialFolders As Object,;
   lcMyDocsPath


loWshShell=Createobject("WScript.Shell")

loFSO=Createobject("Scripting.FileSystemObject")
loSpecialFolders=loWshShell.SpecialFolders

For lni= 0  To loSpecialFolders.Length- 1 
   IF lpcUserName $ LOWER(loSpecialFolders.Item(lni))
   IF "my documents" $ LOWER(loSpecialFolders.Item(lni))
   lcMyDocsPath=loSpecialFolders.Item(lni)
   ENDIF
   ENDIF
 Next

Return lcMyDocsPath



Никогда не говори "невозможно", просто попробуй сделать иначе!
JS (at FoxClub)
...
Рейтинг: 0 / 0
20.12.2007, 15:22
    #35023654
Jurisfox
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать где папка "Мои документы" или как перевести пример с delphi
Более подробно o WScript - здесь:

http://www.js-software.eu/content_ru/wscript_intro.htm
http://www.js-software.eu/content_ru/wscript_shell_properties.htm
http://www.js-software.eu/content_ru/wscript_shell_methods.htm

Последняя пока не закончена...


Никогда не говори "невозможно", просто попробуй сделать иначе!
JS (at FoxClub)
...
Рейтинг: 0 / 0
20.12.2007, 16:00
    #35023902
Рома Б.
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать где папка "Мои документы" или как перевести пример с delphi
Перевод с дельфийского:

DECLARE SHORT SHGetFolderPath IN Shell32;
INTEGER hwndOwner, INTEGER nFolder, INTEGER hToken, INTEGER dwFlags, STRING @pszPath

PUBLIC gcPath
LOCAL lcValue
lcValue = REPLICATE (' ', 254)
=SHGetFolderPath (0, 5, 0, 0, @lcValue)
lcValue = LEFT (lcValue, AT (CHR (0), lcValue) - 1)
gcPath = lcValue

CLEAR DLLS
...
Рейтинг: 0 / 0
20.12.2007, 17:16
    #35024258
CTAC-KO
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать где папка "Мои документы" или как перевести пример с delphi
Спасибо всем и особенно 2Рома Б. за перевод с дельфийского. Я только до одного и допер, что декларить надо в shell32...
Чтением реестра (по примеру с фоксклуба) тоже добился нужного результата, только возникла проблема - сообщение что variable hKey не определена, поэтому сунул ей тупо 0:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
FUNCTION MyDocsPath()
*HKEY_CLASSES_ROOT (0x80000000)
*HKEY_CURRENT_USER (0x80000001)
*HKEY_LOCAL_MACHINE 0x80000002
*HKEY_USERS (0x80000003)
*HKEY_CURRENT_CONFIG (0x80000005)
*HKEY_DYN_DATA (0x80000006) is a valid tree for Windows  95  and Windows  98  computers only.
#define HKEY_CURRENT_USER 0x80000001
#define KEY_READ 0x00020019 
#define ERROR_SUCCESS  0  
DECLARE INTEGER RegOpenKeyEx IN ADVAPI32; 
        INTEGER HKLM, STRING SubKey, INTEGER Dummy, INTEGER Access,INTEGER @hKey 

DECLARE INTEGER RegCloseKey IN ADVAPI32 INTEGER 

DECLARE INTEGER RegQueryValueEx IN ADVAPI32; 
        INTEGER hKey, STRING ValueName, INTEGER Dummy, INTEGER Type,; 
        STRING Data, INTEGER @Size 

* это ветвь реестра, в которой находится интересующий нас параметр 
SubKey="Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders"
hKey= 0 
* Открываем эту ветвь и получаем её handle 
IF RegOpenKeyEx(HKEY_CURRENT_USER,SubKey, 0 ,KEY_READ,@hKey) != ERROR_SUCCESS 
MESSAGEBOX("Неможливо отримати параметр з системного реестра.", 16 ,"Помилка") 
RETURN 
ENDIF 
* "Default DevMode" - это название параметра, значение которого я хочу 
* получить. Сначала определяем, сколько памяти нам нужно зарезервировать, 
* чтобы принять этот параметер 
lnSize= 0  
RegQueryValueEx(hKey,"Personal", 0 , 0 , 0 ,@lnSize) 
* Резервируем память 
lcRegValue = SPACE(lnSize- 1 ) 
* Теперь считываем значение параметра 
RegQueryValueEx(hKey,"Personal", 0 , 0 ,@lcRegValue,@lnSize) 
* Заканчиваем работать с реестром 
RegCloseKey(hKey)
RETURN lcRegValue
но через shell32 всего пара строчек, типа красивее :)
Ну и WScript интересное дело :)
...
Рейтинг: 0 / 0
20.12.2007, 17:17
    #35024259
Bl@ze¶ox
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать где папка "Мои документы" или как перевести пример с delphi
Достаточно просто почитать хелп по функции getenv() при её помощи и без winapi можно обойтись...
...
Рейтинг: 0 / 0
20.12.2007, 17:25
    #35024290
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать где папка "Мои документы" или как перевести пример с delphi
Bl@ze¶oxДостаточно просто почитать хелп по функции getenv() при её помощи и без winapi можно обойтись... Не достаточно, нет в переменных среды рабочего стола или моих документов.
...
Рейтинг: 0 / 0
20.12.2007, 17:26
    #35024295
fox_vik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать где папка "Мои документы" или как перевести пример с delphi
C:\Program Files\Microsoft Visual FoxPro 9\Ffc\_system.vcx
Класс _commonfolder
Метод getfolder

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
LPARAMETERS nFolderID, lCreateNew

* Some common folder ids (refer to SHGetFolderPath in MSDN)
#DEFINE CSIDL_PERSONAL                  0x0005        && My Documents
#DEFINE CSIDL_APPDATA                   0x001a        && <user name>\Application Data
#DEFINE CSIDL_PROGRAM_FILES_COMMON      0x002b        && C:\Program Files\Common
#DEFINE CSIDL_COMMON_APPDATA            0x0023        && All Users\Application Data
#DEFINE CSIDL_WINDOWS                   0x0024        && GetWindowsDirectory()
#DEFINE CSIDL_SYSTEM                    0x0025        && GetSystemDirectory()
#DEFINE CSIDL_PROGRAM_FILES             0x0026        && C:\Program Files
#DEFINE CSIDL_LOCAL_APPDATA             0x001c        && <user name>\Local Settings\Applicaiton Data (non roaming)
#DEFINE CSIDL_FLAG_CREATE       		0x8000		  && create folder if not there

* Misc Flags
#DEFINE SHGFP_TYPE_CURRENT	 0 		&& Return the folder's current path.
#DEFINE SHGFP_TYPE_DEFAULT	1		&& Return the folder's default path.
#DEFINE CSIDL_FLAG_CREATE       		0x8000		  && create folder if not there


* Notes for using for Windows  2000  Logo:
*  Specific user data should be stored in a folder below CSIDL_PERSONAL
*  User application meta data (e.g., FOXUSER) should be stored in either
*  CSIDL_APPDATA or CSIDL_LOCAL_APPDATA. CSIDL_APPDATA allows you to roam on W2K.

LOCAL lcFolder,nRetVal

IF VARTYPE(nFolderID)#"N"
	RETURN ""
ENDIF

lnFolder = nFolderID
IF VARTYPE(lCreateNew)="L" AND lCreateNew
	* If the folder does not exist, then the function creates it for you,
	* fills the string buffer with the path, and returns S_OK. If you do not use the 
	* CSIDL_FLAG_CREATE flag, and the folder does not exist, then the function 
	* returns S_FALSE and nothing is placed in your string buffer.
	lnFolder = lnFolder + CSIDL_FLAG_CREATE
ENDIF

lcFolder = SPACE( 260 )

DECLARE INTEGER SHGetFolderPath IN "shfolder.dll" AS _FFC_SHGetFolderPath ;
    INTEGER hwndOwner, INTEGER nFolder, INTEGER hToken, INTEGER dwFlags, STRING pszPath

nRetVal = _FFC_SHGetFolderPath( 0 , lnFolder,  0 , SHGFP_TYPE_CURRENT, @lcFolder)
CLEAR DLLS _FFC_SHGetFolderPath

IF nRetVal #  0 
	RETURN ""
ENDIF

RETURN ALLTRIM(CHRTRAN(lcFolder ,CHR( 0 ),""))
...
Рейтинг: 0 / 0
20.12.2007, 17:47
    #35024383
Рома Б.
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать где папка "Мои документы" или как перевести пример с delphi
...
Рейтинг: 0 / 0
20.12.2007, 21:21
    #35024805
CTAC-KO
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать где папка "Мои документы" или как перевести пример с delphi
Ну ссыла на http://www.news2news.com/vfp/ вообще очень порадовала :) Сразу в избранном осела :)
...
Рейтинг: 0 / 0
22.12.2007, 02:47
    #35027663
MiklS
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать где папка "Мои документы" или как перевести пример с delphi
Практически полная информация о компьютере и пользователе
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
DECLARE INTEGER GetEnvironmentStrings IN kernel32 

DECLARE RtlMoveMemory IN kernel32 As CopyMemory STRING @ Destination,; 
        INTEGER Source, INTEGER nLength    
Source = GetEnvironmentStrings() 

Destination = SPACE ( 4096 ) && or even  8192 , dont be modest 
     
= CopyMemory (@Destination, Source, Len(Destination)) 

Destination = LEFT (Destination, AT (Chr( 0 )+Chr( 0 ), Destination)) 
     
ss = "" 
FOR ii= 1  TO Len(Destination) 
    ch = SUBSTR (Destination, ii,  1 ) 
    IF ch = Chr( 0 ) 
        lnPos = AT ("=", ss) 
        lcName = LEFT (ss, lnPos- 1 ) 
        lcValue = SUBSTR (ss, lnPos+ 1 ) 
        ? lcName, lcValue 
        ss = "" 
    ELSE 
        ss = ss + ch 
    ENDIF 
ENDFOR 
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Как узнать где папка "Мои документы" или как перевести пример с delphi / 13 сообщений из 13, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]