for flooders
:: Главная :: Решения :: Статьи :: Сайт М. Дроздова :: Файловый архив :: Книга по VFP 9 :: Русский Help Online :: OFF-LINE Форум
   Лисоводы   всех   стран,  объединяйтесь !!!  

Список Форумов  :: Не фоксом единым
  

папка десктоп
boba

Сообщений: 5630
Откуда: Медвежьи озера-
Дата: 06.06.20 21:06:16
Несколько раз в разных задачах приходилось
писать на десктоп. Приходилось подбирать координаты папки
в зависимости от версии и языка виндов.
Сейчас снова нужно написать нечто.
Но в силу работы по удаленке не могу залезь на компьютер пользователя
В принципе функция getdir с нужными
аргументами позволяет увидеть в списке и десктоп
В старых программах так и делал. Позволял кнопкой выбрать
десктоп. Но такая кнопка рассчитана на квалифицированного пользователя.
В новой работе надежды на такое нет.
И так вопрос, как проще всего определить десктоп
независимо от версии виндов.
Это не всегда верно
windows10i.ru



Исправлено: boba, 06.06.20 21:09
Ratings: 0 negative/0 positive

Re: папка десктоп
_vit

Сообщений: 4332
Дата: 06.06.20 23:09:05
Как вариант.

  
  LOCAL lObjShell, lStrPath  
  lObjShell = Createobject("Wscript.Shell")  
  lStrPath = lObjShell.SpecialFolders("Desktop")  
  ? lStrPath

Но в локализованных версиях видимо надо соответсвующее название папки подставлять что не есть гуд.



Исправлено: _vit, 06.06.20 23:19
Ratings: 0 negative/0 positive

Re: папка десктоп
_vit

Сообщений: 4332
Дата: 06.06.20 23:29:30
Еще вариант нашел. но он кажется только начиная с Висты работает.

  
 * Define constants to use with SHGetKnownFolderIDList routine  
 * Values copied from MSDN reference site (although not the names)  
  #define k_FID_CAMERAROLL	"{AB5FB87B-7CE2-4F83-915D-550846C9537B}"  
  #define k_FID_DESKTOP		"{B4BFCC3A-DB2C-424C-B029-7FE99A87C641}"  
  #define k_FID_DOCUMENTS		"{FDD39AD0-238F-46AF-ADB4-6C85480369C7}"  
  #define k_FID_PICTURES		"{33E28130-4E1E-4676-835A-98395C3BC3BB}"  
  #define k_FID_SKYCAMERAROLL	"{767E6811-49CB-4273-87C2-20F355E1085B}"  
  #define k_FID_SKYDOCUMENTS	"{24D89E24-2F19-4534-9DDE-6A6671FBB8FE}"  
  #define k_FID_SKYPICTURES	"{339719B5-8C47-4894-94C2-D8F77ADD44A6}"  
    
  ? GetKnownFolderPath(k_FID_DESKTOP)  
    
 **********************************************  
  function getKnownFolderPath (cDefFoldID as string, cErrMsg as string) as string  
 **********************************************  
  local nOutBuff, cOutStr, cbGUID  
    
 * Declare all the required system calls (protected for repeat calls)  
  if vartype(__G_DLL_CLSIDFROMSTRING_) = "U"  
  	declare long CLSIDFromString ;  
  		in ole32.dll ;  
  		string cInStr, ;  
  		string @ cGUID  
  	public __G_DLL_CLSIDFROMSTRING_  
  endif  
    
  if vartype(__G_DLL_SHGETKNOWNFOLDERIDLIST_) = "U"  
  	declare long SHGetKnownFolderIDList ;  
  		in shell32.dll ;  
  		string cGUID,;  
  		long dwFlags,;  
  		long hToken,;  
  		long @ ppidl  
  	public __G_DLL_SHGETKNOWNFOLDERIDLIST_  
  endif  
    
  if vartype(__G_DLL_SHGETPATHFROMIDLIST_) = "U"  
  	declare long SHGetPathFromIDList ;  
  		in shell32.dll ;  
  		long ppidl, ;  
  		string @ cPath  
  	public __G_DLL_SHGETPATHFROMIDLIST_  
  endif  
    
  if vartype(__G_DLL_COTASKMEMFREE_) = "U"  
  	declare CoTaskMemFree ;  
  		in ole32.dll ;  
  		long pVoid  
  	public __G_DLL_COTASKMEMFREE_  
  endif  
    
 * Convert the string GUID to a binary version  
  cbGUID= space(16)  
  cErrMsg= checkSysError(CLSIDFromString(strconv(m.cDefFoldID, 5) + chr(0), @cbGUID))  
    
  if empty(m.cErrMsg)  
 	* Get back the folder path in a PIDL structure  
 	* Flags - 0x1000 -> KF_FLAG_NO_ALIAS - Expand any alias placeholders, eg. %USERPROFILE%  
 	*       - 0x4000 -> KF_FLAG_DONT_VERIFY - Don't check that the folder exists before returning the value  
  	nOutBuff= 0  
  	cErrMsg= checkSysError(SHGetKnownFolderIDList(m.cbGUID, 0x1000 + 0x4000, 0, @nOutBuff))  
  endif  
    
  if empty(m.cErrMsg)  
 	* Extract the path string from the PIDL structure  
  	cOutStr= space(512)  
  	cErrMsg= checkSysError(SHGetPathFromIDList(m.nOutBuff, @cOutStr))  
  endif  
    
 * Clean up the memory used in the above system calls  
  CoTaskMemFree(m.nOutBuff)  
    
 * Ensure any returned path has the trailing backslash  
  return iif(empty(m.cErrMsg), addbs(m.cOutStr), "")  
  endfunc	&& getKnownFolderPath()  
    
 **********************************************  
  function checkSysError (nResult as integer) as string  
 **********************************************  
  local cMsg, cInBuff, nSize  
    
  if empty(m.nResult) or m.nResult = 1	&& covers missing parameter, 0 (S_OK) or 1 (S_FALSE)  
 	* It must have worked   
  	cMsg= ""  
  else  
 	* Declare the required system call (protected for repeat calls)  
  	if vartype(__G_DLL_FORMATMESSAGE_) = "U"  
  		declare long FormatMessage ;  
  			in win32api ;  
  			long dwFlags ,;  
  			long lpvSource,;  
  			long dwMsgId,;  
  			long dwLangId,;  
  			string @lpBuffer,;  
  			long nSize,;  
  			long Argument  
  		public __G_DLL_FORMATMESSAGE_  
  	endif  
    
 	* Retrieve the system message  
 	* Flags - 0x1000 -> FORMAT_MESSAGE_FROM_SYSTEM Use the system message-table  
  	cInBuff= space(1024)  
  	nSize= FormatMessage(0x1000, 0, m.nResult, 0, @cInBuff, len(m.cInBuff), 0)  
  	if m.nSize > 0  
  		cMsg= left(m.cInBuff, m.nSize)  
  	else  
 		* No message came back - maybe it is a application specific message  
  		cMsg= "Unknown error - code " + ltrim(str(m.nResult))  
  	endif  
  endif  
    
  return m.cMsg  
  endfunc	&& checkSysError()   



Исправлено: _vit, 06.06.20 23:29
Ratings: 0 negative/0 positive

Re: папка десктоп
boba

Сообщений: 5630
Откуда: Медвежьи озера-
Дата: 07.06.20 08:17:01
Спасибо
Знать бы, есть
ли на компе Wscript.Shell
Сейчас второй вариант посмотрю
Ratings: 0 negative/0 positive

Re: папка десктоп
boba

Сообщений: 5630
Откуда: Медвежьи озера-
Дата: 07.06.20 08:23:21
Это ничего не вернуло
?getKnownFolderPath('Desktop')
?getKnownFolderPath('Desktop','')
Понятия не имею, русские ли там винды
Наверное нужно какой-то перебор вариантов делать
Посмотрел свои старые решения на этот счет,
тоже методом тыка
у меня дома
?DIRECTORY("C:\Users\"+alltrim(SUBSTR(SYS(0),AT('#',SYS(0))+1))+"\Desktop")
дает ложь
Это
LOCAL lObjShell, lStrPath
lObjShell = Createobject("Wscript.Shell")
lStrPath = lObjShell.SpecialFolders("Desktop")
? lStrPath
дает
c:\users\пк\desktop



Исправлено: boba, 07.06.20 09:12
Ratings: 0 negative/0 positive

Re: папка десктоп
_vit

Сообщений: 4332
Дата: 07.06.20 11:21:48
boba
Это ничего не вернуло
?getKnownFolderPath('Desktop')

Надо использовать в качестве параметра не имя папки а идентификатор.

? GetKnownFolderPath(k_FID_DESKTOP)
если пробуешь пример один к одному или

? GetKnownFolderPath("{B4BFCC3A-DB2C-424C-B029-7FE99A87C641}")
Ratings: 0 negative/0 positive

Re: папка десктоп
ssa

Сообщений: 12588
Откуда: Москва
Дата: 07.06.20 14:17:27
boba
?DIRECTORY("C:\Users\"+alltrim(SUBSTR(SYS(0),AT('#',SYS(0))+1))+"\Desktop")
дает ложь
1. Юзерские профили не обязаны быть на диске С:.
2. Самый простой вариант
?GetEnv("HOMEDRIVE")+GetEnv("HOMEPATH")+'\desktop'  
  или  
  ?GetEnv("USERPROFILE")+'\desktop'


------------------
Лень - это неосознанная мудрость.




Исправлено: ssa, 07.06.20 14:31
Ratings: 0 negative/0 positive

Re: папка десктоп
Igor Korolyov

Сообщений: 33696
Дата: 07.06.20 15:43:33
_vit
Еще вариант нашел. но он кажется только начиная с Висты работает.
До того была АПИ функция SHGetFolderLocation.


------------------
WBR, Igor
Ratings: 0 negative/0 positive

Re: папка десктоп
Igor Korolyov

Сообщений: 33696
Дата: 07.06.20 15:45:02
ssa
1. Юзерские профили не обязаны быть на диске С:.
2. Самый простой вариант
?GetEnv("HOMEDRIVE")+GetEnv("HOMEPATH")+'\desktop'  
  или  
  ?GetEnv("USERPROFILE")+'\desktop'

Равно и имя папки не обязано быть desktop - на локализованной версии ОС оно таковым и не будет. Следует то или иное АПИ использовать.


------------------
WBR, Igor




Исправлено: Igor Korolyov, 07.06.20 15:45
Ratings: 0 negative/0 positive

Re: папка десктоп
_vit

Сообщений: 4332
Дата: 07.06.20 17:45:34
Igor Korolyov
_vit
Еще вариант нашел. но он кажется только начиная с Висты работает.
До того была АПИ функция SHGetFolderLocation.

И SHGetSpecialFolderPath. Но они обе устаревшие и не рекомендуются к использованию.

Хотя обе работают и на десятке.

  
  #DEFINE CSIDL_DESKTOP 0x0000  
  DECLARE SHORT SHGetFolderPath IN SHFolder.dll INTEGER hwndOwner, INTEGER nFolder, INTEGER hToken, INTEGER dwFlags, STRING @pszPath  
  DECLARE SHGetSpecialFolderPath IN SHELL32.DLL LONG hwndOwner, STRING @cSpecialFolderPath, LONG nWhichFolder  
    
  LOCAL lcFolderPath  
    
  lcFolderPath = space(255)  
  SHGetFolderPath(0, CSIDL_DESKTOP, 0, 0, @lcFolderPath)  
  ? ALLTRIM(lcFolderPath)  
    
  lcFolderPath = space(255)  
  SHGetSpecialFolderPath(0, @lcFolderPath , CSIDL_DESKTOP)  
  ? ALLTRIM(lcFolderPath)
Ratings: 0 negative/0 positive

Re: папка десктоп
boba

Сообщений: 5630
Откуда: Медвежьи озера-
Дата: 07.06.20 18:44:53
Спасибо ребята
Все работает
Еще до кучи
При переносе ярлыка на десктоп
с эталонного нужно слегка изменить его
свойства в зависимости от пользователя
После названия exe в ярлыке поменять там фамилию
lobj = createobject('wscript.shell')
имеет метод createshotcut
А как влезь в уже созданный простым копирование
на десктоп эталонного?
Что -то не вижу ни методов ни свойств
Ratings: 0 negative/0 positive

Re: папка десктоп
Igor Korolyov

Сообщений: 33696
Дата: 07.06.20 21:32:15
boba
lobj = createobject('wscript.shell')
имеет метод createshotcut
А как влезь в уже созданный простым копирование
на десктоп эталонного?
Этот же метод работает и с существующимя ярлыками (просто передай путь и имя существующего lnk файла) - позволяя поменять их свойства и сделать Save()


------------------
WBR, Igor
Ratings: 0 negative/0 positive

Re: папка десктоп
ssa

Сообщений: 12588
Откуда: Москва
Дата: 07.06.20 23:57:36
Igor Korolyov
ssa
1. Юзерские профили не обязаны быть на диске С:.
2. Самый простой вариант
?GetEnv("HOMEDRIVE")+GetEnv("HOMEPATH")+'\desktop'  
  или  
  ?GetEnv("USERPROFILE")+'\desktop'

Равно и имя папки не обязано быть desktop - на локализованной версии ОС оно таковым и не будет. Следует то или иное АПИ использовать.
На локализованной ОС папка все равно desktop. Только эксплорер её на лету локализует.

------------------
Лень - это неосознанная мудрость.
Ratings: 0 negative/0 positive

Re: папка десктоп
Аспид

Сообщений: 3421
Откуда: Москва
Дата: 08.06.20 08:41:20
boba
После названия exe в ярлыке поменять там фамилию
lobj = createobject('wscript.shell')
имеет метод createshotcut
А как влезь в уже созданный простым копирование
на десктоп эталонного?
Что -то не вижу ни методов ни свойств

Дополню, поясню Игоря.
Просто название метода сбивает. На самом деле он и создает, и изменяет.

И Сергея. Полагаю он на 100% прав.
Где бы ни делал. Ссылка на десктоп работает.
Ratings: 0 negative/0 positive

Re: папка десктоп
boba

Сообщений: 5630
Откуда: Медвежьи озера-
Дата: 08.06.20 14:10:05
Спасибо, все сделал
Ratings: 0 negative/0 positive

Re: папка десктоп
Igor Korolyov

Сообщений: 33696
Дата: 08.06.20 22:41:57
Лень проверять (тем более я никогда не пользовался русскими версиями WinXP, и образ надо где-то искать), но мне помнится что на русском WindowsXP папка таки называлась "Рабочий стол". Вот на английской WindowsXP с установленным русским MUI - да, был Desktop - и только проводник показывал алиас посредством записей в desktop.ini файле (в такой редакции ОС можно было динамически менять "язык интерфейса"). Кроме того, папка может быть перемещена утилитами типа PowerToys или же [доменными] политиками. Я даже не уверен что во всех нештатных случаях поможет определение пути через АПИ/скрипт-шелл.


------------------
WBR, Igor
Ratings: 0 negative/0 positive

Re: папка десктоп
lulgu
Автор

Сообщений: 1662
Дата: 11.06.20 09:16:17
Аспид
Дополню, поясню Игоря.
Просто название метода сбивает. На самом деле он и создает, и изменяет.

Метод CreateShotcut ничего не изменяет, он создает объект.
Ratings: 1 negative/0 positive



Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 9 PaulWist Wild ZAY  (Гостей: 7)

23.09.2020 19:56:55 exec: 0.35
Mem: 1.427 Mb

© 2000-2020 Fox Club 
Яндекс.Метрика