:: Не фоксом единым
папка десктоп
boba
Автор

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



Исправлено 1 раз(а). Последнее : boba, 06.06.20 21:09
Ratings: 0 negative/0 positive
Re: папка десктоп
_vit

Сообщений: 5173
Дата регистрации: 29.07.2002
Как вариант.

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

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



Исправлено 1 раз(а). Последнее : _vit, 06.06.20 23:19
Ratings: 0 negative/0 positive
Re: папка десктоп
_vit

Сообщений: 5173
Дата регистрации: 29.07.2002
Еще вариант нашел. но он кажется только начиная с Висты работает.

* 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()



Исправлено 1 раз(а). Последнее : _vit, 06.06.20 23:29
Ratings: 0 negative/0 positive
Re: папка десктоп
boba
Автор

Сообщений: 6269
Откуда: Медвежьи озера-
Дата регистрации: 26.03.2001
Спасибо
Знать бы, есть
ли на компе Wscript.Shell
Сейчас второй вариант посмотрю
Ratings: 0 negative/0 positive
Re: папка десктоп
boba
Автор

Сообщений: 6269
Откуда: Медвежьи озера-
Дата регистрации: 26.03.2001
Это ничего не вернуло
?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



Исправлено 2 раз(а). Последнее : boba, 07.06.20 09:12
Ratings: 0 negative/0 positive
Re: папка десктоп
_vit

Сообщений: 5173
Дата регистрации: 29.07.2002
boba
Это ничего не вернуло
?getKnownFolderPath('Desktop')

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

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

? GetKnownFolderPath("{B4BFCC3A-DB2C-424C-B029-7FE99A87C641}")
Ratings: 0 negative/0 positive
Re: папка десктоп
ssa

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


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




Исправлено 1 раз(а). Последнее : ssa, 07.06.20 14:31
Ratings: 0 negative/0 positive
Re: папка десктоп
Igor Korolyov

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


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: папка десктоп
Igor Korolyov

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

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


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




Исправлено 1 раз(а). Последнее : Igor Korolyov, 07.06.20 15:45
Ratings: 0 negative/0 positive
Re: папка десктоп
_vit

Сообщений: 5173
Дата регистрации: 29.07.2002
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
Автор

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

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


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: папка десктоп
ssa

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

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

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

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

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

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

Сообщений: 6269
Откуда: Медвежьи озера-
Дата регистрации: 26.03.2001
Спасибо, все сделал
Ratings: 0 negative/0 positive
Re: папка десктоп
Igor Korolyov

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


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: папка десктоп
lulgu

Сообщений: 1838
Дата регистрации: 30.11.2016
Аспид
Дополню, поясню Игоря.
Просто название метода сбивает. На самом деле он и создает, и изменяет.

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


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

On-line: 6 (Гостей: 6)

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