• Администрация SafeZone приветствует вас на нашем форуме!
    Если вы больше не желаете видеть рекламу при просмотре тем и сообщений - то достаточно просто зарегистрироваться. Для зарегистрированных пользователей реклама не отображается.

Решена Способы запуска приложений с использованием CLSID

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
5,623
Симпатии
5,504
#1
Давайте дополним статью: http://safezone.cc/threads/nemnogo-o-clsid.20444/
и немного здесь: http://safezone.cc/threads/izuchaem-skrytye-vozmozhnosti-windows-7.5422/
и здесь http://safezone.cc/threads/sekrety-windows-7-kak-rabotaet-rasshirennaja-panel-upravlenija.11460/

Информации очень мало.
Мои дополнения:
(честно говоря сильно не вдавался в чтение). Только пощупал реестр и справочники и Google.

Способы использования CLSID (GUID)

1) создание новой папки с именем Любое Имя.{GUID}
2) через ПУСК -> Выполнить (или комбинацией клавиш Win + R)
затем так:
CMD/BATCH:
explorer Shell:::{GUID}
так:
CMD/BATCH:
explorer ::{GUID}
или так:
CMD/BATCH:
::{GUID}
где GUID - идентификатор одной из Special Folder (см. под спойлером).
В MSDN часть виртуальных папок и псевдонимов можно найти среди KnownFolderID.
Не все они будут работать с рассматриваемым синтаксисом. Это зависит от способа их регистрации в системе (при чём это может различаться от версии к версии).

3) через ПУСК -> набрать в строке поиска:
Код:
shell:::{GUID}
(обратите внимание на разное кол-во знаков : )
3.1.) используя псевдоним:
Код:
shell:псевдоним
или
Код:
explorer "shell:псевдоним"
Псевдонимы можно взять из имен параметров в разделах:
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders
HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders
4) Используя AppUserModelID.
Код:
explorer.exe shell:Путь\[App.UserModel.ID]
например:
Код:
explorer.exe shell:AppsFolder\Microsoft.Windows.Spartan_cw5n1h2txyewy!Microsoft.Spartan.Spartan
App.UserModel.ID можно узнать, введя:
Код:
shell:AppsFolder
Выбрать вид папки -> Таблица.
Нажать левый ALT, View (вид) -> Choose details... (Выбрать столбцы...) -> отметить галкой "AppUserModelID"

Подробнее в этой статье:
Exclusive: How to start a Modern app from desktop without going to the Metro Start Screen

Список псевдонимов, CLSID (GUID)
Синим отмечены папки, которые появились в Windows 8.


Также см.:
Shell commands in Windows 8
Complete List of Windows 10 CLSID Key (GUID) Shortcuts

Дополнительные ключи для explorer.exe:
Проводник
explorer.exe [/n][/e] [(,)/root,<folder>] [/select,<object>]

/n - открытие нового окна, если уже открыто окно, то оно дублируется (для ОС >= Vista неактуально).
/e - с отображением дерева папок принудительно.
/idlist,:handle: process specifies object as ITEMIDLIST in shared memory block with given handle in context of given process. Подробности здесь.
/root - <folder> в качестве корня вместо "Рабочего стола".
/root,/idlist,:handle: process (без пробела)
/root,clsid
/root,clsid,path
/root,path
/select - <object> выделить объект.
/separate - запуск Проводника в отдельном процессе.

Примеры (Windows 7, вероятно и др.):
CMD/BATCH:
:: Открыть Мой компьютер
explorer ::{20D04FE0-3AEA-1069-A2D8-08002B30309D}
:: или просто
explorer ,
:: Открыть текущий каталог (актуально, когда находишься в консоли CMD)
explorer .
:: Открыть Корзину
explorer ::{645FF040-5081-101B-9F08-00AA002F954E}
:: Открыть Рабочий стол
explorer Shell:::{3080F90D-D7AD-11D9-BD98-0000947B0257}
:: Открыть Рабочий стол в отедльном процессе
explorer /separate,/root,Shell:::{3080F90D-D7AD-11D9-BD98-0000947B0257}
:: Открыть Рабочий стол в новой папке, используя псевдоним
explorer shell:Desktop
Ссылки по теме:
Ed Bott - 94 more secret Windows shortcuts
The Windows Explorer Command Line
MSDN - KNOWNFOLDERID
MSDN - CSIDL
MSDN - Canonical Names of Control Panel Items
Описание ключей и параметров CLSID / AppID
_____________________________________________________________________

Теперь мои вопросы и я не жду, что получу на них ответы (постепенно и сам буду искать их):

Возьмем для примера:
CLSID: {7be9d83c-a729-4d97-b5a7-1b7313c39e0a}
Физ. расположение: C:\ProgramData\Microsoft\Windows\Start Menu\Programs

1) О дополнительніх параметрах HKCR\CLSID:

В статье от Koza Nozdri говориться про:
а) HKCR\CLSID\{GUID}\InprocServer32
Под этим разделом еще есть подразделы:
б) MergedFolder с параметром Location, значение, к примеру, @shell32.dll,-4177
rundll32.exe говорит, что это не точка входа функции, значит ресурс.
Ага вот... Windows 8 DLL File Information - shell32.dll
говорит, что это якобы строка "Current User". Подразумевается от какого имени пользователя будет запущена?
в) ShellFolder с параметром Attributes, значение, к примеру, 0x28100000 (672137216)
О чем нам говорит этот атрибут?

2) CLSID и GUID - каково соотношение этих понятий?
Где-то и читал, но забыл. Своими словами можно...

3) Почему некоторые GUID, можно подставлять только в shell:::{GUID}, но не в explorer ::{GUID} ?

4) Как связан GIUD с его псевдонимом и физическим расположением каталога на диске?
По-другому: откуда система знает какие файлы/физ+вирт.папки (объекты) должны находится в этой виртуальной папке?

5) Можно ли зарегистрировать свой собственный псевдоним с GUID?
 
Последнее редактирование:

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
5,623
Симпатии
5,504
#2
Частично ответ на № 4) касаемо Canonical Name

Xenophane написал(а):
Just wrote a little Powershell script to cycle through CLSID and get all the GUIDS that contains a "ShellFolder" and a key called "LocalizedString"
So if anyone can't sleep tonight, you could sit down and figure out what is hidden behind these GUID's
Источник

Вот что я первое нашел вручную:
HKCR\CLSID\{0142e4d0-fb7a-11dc-ba4a-000ffe7ab428}
LocalizedString = @%SystemRoot%\System32\biocpl.dll,-1
System.ApplicationName = Microsoft.BiometricDevices

->> shell:::{0142e4d0-fb7a-11dc-ba4a-000ffe7ab428}
Только вот не пойму biocpl.dll,-1
- это вроде иконка, а не строка. Продолжаю выяснять.Забавно (win + tab):
Shell:::{3080F90E-D7AD-11D9-BD98-0000947B0257} :D
 
Последнее редактирование:

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
5,623
Симпатии
5,504
#3
Процитирую некоторые ответы от Казакевича Олега.

1) По поводу HKCR\CLSID\{...}\ShellFolder - Attributes

Не уверен, что поможет, но кое-что есть здесь:
Implementing the Basic Folder Object Interfaces
Плотно с этой темой я не работал, так что прокомментировать не могу.

2) GUID (или UUID, что одно и то же) - это обобщенное название для любого
идентификатора, вне зависимости от того, где и как он используется.
CLSID - это тот же GUID, только название другое. CLSID используется в COM,
отсюда и название (CLaSs IDentifier - идентификатор класса). Есть еще,
например, LIBID (LIBrary IDentifier - идентификатор библиотеки типов),
IID (Interface IDentifier - идентификатор COM-интерфейса) и т.д.
Т.е. CLSID - это тот же GUID/UUID, просто называется по-другому, чтобы читающему
код сразу было понятно, откуда идентификатор.
4) Как связан GIUD с его псевдонимом и физическим расположением каталога на диске?
По-другому: откуда система знает какие файлы/физ+вирт.папки (объекты) должны находится в этой виртуальной папке?

Система этого не знает. За отображение содержимого папки и работу с ним (copy-paste,
drag-n-drop, properties и т.п.) отвечает соответствующий объект, реализующий нужные интерфейсы.
В MSDN есть кое-что по данной теме, но без хорошего понимания COM туда лучше не соваться.


5) Можно ли зарегистрировать свой собдственный псевдоним с GUID?
Ты имеешь в виду, можно ли создать свою виртуальную папку, такую как, например,
"сетевое окружение" ? Да, можно. Сошлюсь, опять же, на MSDN, отправная точка здесь: Windows Shell
 
Последнее редактирование:

Кирилл

Команда форума
Администратор
Сообщения
13,298
Симпатии
5,849
#4
CLSID и GUID - каково соотношение этих понятий?
2) GUID (или UUID, что одно и то же) - это обобщенное название для любого
идентификатора, вне зависимости от того, где и как он используется.
CLSID - это тот же GUID, только название другое. CLSID используется в COM,
отсюда и название (CLaSs IDentifier - идентификатор класса). Есть еще,
например, LIBID (LIBrary IDentifier - идентификатор библиотеки типов),
IID (Interface IDentifier - идентификатор COM-интерфейса) и т.д.
Т.е. CLSID - это тот же GUID/UUID, просто называется по-другому, чтобы читающему
код сразу было понятно, откуда идентификатор.

Все таки разница есть.
GUID является уникальным номером идентифицирующим программное обеспечение,в том числе в разных вариантах UUID.

CLSID же является идентификатором класса,то есть он связан с объектами другого рода,в связи с чем мы делаем вывод что и использовать их можно по разному.
откуда система знает какие файлы/физ+вирт.папки (объекты) должны находится в этой виртуальной папке?
Тут все и сложно,но если ты разобрался с темой файловых ассоциаций -тогда все просто.

Для того что бы прочесть идентификатор мы должны понимать что они являют собой объект,с которым связаны.
Так в каждом разделе HKEY_CLASSES_ROOT\CLSID\{****} мы имеем значение параметра по умолчанию выступающего в роли связующего звена.

Пример.

HKEY_CLASSES_ROOT\CLSID\{*********} @=test
HKEY_CLASSES_ROOT\CLSID\{*********}\InprocServer32 имеет параметр,ссылающийся на tets.dll



Как система читает GUID?
Он записывается в соответствующие заголовки программы при написании.

Так же InprocServer32 может содержать другие данные.

Об этом рассказано в этой теме:
http://safezone.cc/threads/nemnogo-o-clsid.20444/
а) HKCR\CLSID\{GUID}\InprocServer32
Под этим разделом еще есть подразделы:
б) MergedFolder с параметром Location, значение, к примеру, @shell32.dll,-4177
rundll32.exe говорит, что єто не точка входа функции, значит ресурс.
Ага вот... http://www.nirsoft.net/dll_information/windows8/shell32_dll.html
говорит, что это якобы строка "Current User". Подразумевается от какого имени пользователя будет запущена?
в) ShellFolder с параметром Attributes, значение, к примеру, 0x28100000 (672137216)
О чем нам говорит этот атрибут?

Это надо подумать как сформулировать)
Позже будет.


Почему некоторые GUID, можно подставлять только в shell:::{GUID}, но не в explorer ::{GUID} ?
Не так давно разбирался в этом,суть кроется опять же в назначении идентификаторов,более подробнее тоже расскажу позже.


) Можно ли зарегистрировать свой собдственный псевдоним с GUID?
Да,можно.
 
Последнее редактирование:

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
5,623
Симпатии
5,504
#5
Все таки разница есть.
GUID является уникальным номером идентифицирующим программное обеспечение,в том числе в разных вариантах UUID.
CLSID же является идентификатором класса, то есть он связан с объектами другого рода,в связи с чем мы делаем вывод что и использовать их можно по разному.
Что и демонстрирует пример C#-кода, где говорится:
MSDN написал(а):
The following example uses the System.Runtime.InteropServices.GuidAttribute class to assign a GUID to an interface and to a user-defined class. It retrieves the value of the GUID by calling the GetCustomAttribute method, and compares it with two other GUIDs to determine whether they are equal.
Единственное - я не расскажу грамотно как добавляется номер гуид к заголовкам программ.
тут можешь помочь
Основное предназначение GUID - разрешить кофликт имен при идентификации (доступе к) интерфейса, класса, COM и др. сервисов.
GUID представляет из себя уникальную строку в виде 32 шестнадцатеричных цифр, разбитой на группы дефисами и окружённой фигурными скобками:
{6F9619FF-8B86-D011-B42D-00CF4FC964FF}. Формируется он согласно стандарта UUID.

Любая программа в своем исходном виде (исходный код) еще не имеет определенного GUID.
GUID назначается программе при регистрации библиотек, OLE, COM-объектов, предоставляющих свой интерфейс для использования извне инкапсулированных в нем функций.
GUID, как объект, состоит из структуры, которая генерируется на основании:
  • Идентификатора машины и сетевой платы (позже Microsoft отказалась от этого пункта вследствие претензий)
  • Текущей времи и даты
  • Информации о конфигурации системы
  • Случайной компоненты
GUID для Вашего приложения можно получить, используя в нем API-фукнцию CoCreateGuid.
Хотя сама Microsoft придерживается иногда другой методологии:
Описание схемы формирования GUID кода продукта для программ Office XP
GUID для ASP-скриптов. (используется дата-время / случайное число)

Пример класса на .NET (VB.NET, C#), и кода для Visual Basic 6, позволяюего генерировать GUID
Используется API-фукнция CoCreateGuid

Платформа .NET

VB.NET:
Класс, позволяющий генерировать уникальный идентификатор
public sealed class ComGuid
{
    private ComGuid()
    {}

    public static Guid NewGuid()
    {
        Guid val = Guid.Empty;
        int hresult = 0;
        hresult = CoCreateGuid(ref val);

        if(hresult != 0)
        {
            throw new System.ComponentModel.Win32Exception(Marshal.GetLastWin32Error(), "Error creating new Guid");
        }

        return val;
    }

    [DllImport("ole32.dll", SetLastError=true)]
    private static extern int CoCreateGuid(ref Guid pguid );
}

// Код для кнопки в основном классе
private void button1_Click(object sender, EventArgs e)
{
    textBox1.Text = ComGuid.NewGuid().ToString();
}
Источник.

Пример для Visual Basic 6.0.:

VB.NET:
Private Type GUID
Data1 As Long
Data2 As Integer
Data3 As Integer
Data4(7) As Byte
End Type

Private Declare Function CoCreateGuid Lib "OLE32.DLL" (pGuid As GUID) As
Long

Public Function GetGUID() As String
'(c) 2000 Gus Molina

Dim udtGUID As GUID

If (CoCreateGuid(udtGUID) = 0) Then

GetGUID = _
String(8 - Len(Hex$(udtGUID.Data1)), "0") & Hex$(udtGUID.Data1) & _
String(4 - Len(Hex$(udtGUID.Data2)), "0") & Hex$(udtGUID.Data2) & _
String(4 - Len(Hex$(udtGUID.Data3)), "0") & Hex$(udtGUID.Data3) & _
IIf((udtGUID.Data4(0) < &H10), "0", "") & Hex$(udtGUID.Data4(0)) & _
IIf((udtGUID.Data4(1) < &H10), "0", "") & Hex$(udtGUID.Data4(1)) & _
IIf((udtGUID.Data4(2) < &H10), "0", "") & Hex$(udtGUID.Data4(2)) & _
IIf((udtGUID.Data4(3) < &H10), "0", "") & Hex$(udtGUID.Data4(3)) & _
IIf((udtGUID.Data4(4) < &H10), "0", "") & Hex$(udtGUID.Data4(4)) & _
IIf((udtGUID.Data4(5) < &H10), "0", "") & Hex$(udtGUID.Data4(5)) & _
IIf((udtGUID.Data4(6) < &H10), "0", "") & Hex$(udtGUID.Data4(6)) & _
IIf((udtGUID.Data4(7) < &H10), "0", "") & Hex$(udtGUID.Data4(7))
End If

End Function
Источник.

[/code]

Полный перечень COM-объектов, их имен, методов, свойств, я могу увидеть, например,
установив редактор скриптов PrimalScript. View -> Browser Panel -> Object Browser.
Заодно там же есть перечень WMI-классов и объектов .NET и PowerShell.
Primal_Script_OBJ.png

Как можно воспользоваться в своей программе инфтерфейсом, которому назначен GUID.

В VBA/Visual Basic 6 достаточно подставить {GUID} в функцию создания объекта, например:
использование голосового движка, для проговаривания текста:
Код:
Set oVoice = CreateObject("SAPI.SpVoice")
oVoice.Speak "Hello World."
Здесь мы вводим имя объекта: SAPI.SpVoice
Давайте попробуем найти его в реестре. Вуаля:

SAPI.Voice.GUID.png

Теперь записываем его GUID в виде такой конструцкии:
Код:
Set oVoice = CreateObject("new:{96749377-3391-11D2-9EE3-00C04F797396}")
oVoice.Speak "Hello World."
Запускаем. Убеждаемся, что в таком виде тоже работает*.
* Данный формат записи доступен только для диалектов VBA и Visual Basic 6.
* Для Visual Basic Scripting Edition можно задавать только имена объектов, а еще получать доступ к .NET платформе.

Смысл демонстрации в том, что существуют объекты, до которых нельзя "достучаться" через имя.
В таком случае GUID нам будет полезен.
VB.NET:
Sub ПримерИспользования()
     txt = ClipboardText
     MsgBox txt, vbInformation, "Содержимое буфера обмена Windows"
End Sub

Function ClipboardText() ' чтение из буфера обмена
   With GetObject("New:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")
         .GetFromClipboard
         ClipboardText = .GetText
     End With
End Function

Sub SetClipboardText(ByVal txt$) ' запись в буфер обмена
   With GetObject("New:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")
         .SetText txt$
         .PutInClipboard
     End With
End Sub
К вопросу о получении имени объекта по GUID.

Имена и GUID, к примеру, всех элементов Панели управления, можно получить перейдя к ветке:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\ControlPanel\NameSpace\

Имя для Well-Known Folder по указанному GUID, можно узнать, посмотрев значение по-умолчанию в:
HKEY_CLASSES_ROOT\CLSID\{GUID}

Как получить GUID установленного в системе ПО:

Например через WMI, с помощью такого vbscript:
VB.NET:
strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2")
Set colItems = objWMIService.ExecQuery( _
  "SELECT * FROM Win32_Product",,48)
For Each objItem in colItems
  Wscript.Echo "-----------------------------------"
  Wscript.Echo "Win32_Product instance"
  Wscript.Echo "-----------------------------------"
  Wscript.Echo "IdentifyingNumber: " & objItem.IdentifyingNumber
  Wscript.Echo "Name: " & objItem.Name
  Wscript.Echo "PackageCache: " & objItem.PackageCache
Next
GET_Prog_Guids.png
 
Последнее редактирование:

Кирилл

Команда форума
Администратор
Сообщения
13,298
Симпатии
5,849
#6
MergedFolder с параметром Location, значение, к примеру, @shell32.dll,-4177
rundll32.exe говорит, что єто не точка входа функции, значит ресурс.
Ага вот... http://www.nirsoft.net/dll_information/windows8/shell32_dll.html
говорит, что это якобы строка "Current User". Подразумевается от какого имени пользователя будет запущена?
в) ShellFolder с параметром Attributes, значение, к примеру, 0x28100000 (672137216)
О чем нам говорит этот атрибут?


Продолжаю тему,рад что смог выбрать время так как самому уже интересно.
MergedFolder как я сделал выводы на основании анализа является разделом,который указывает cuid с чем произведено сопряжение непосредственно ,то есть настройка сопряжения guid идентифицирующего некоторый объект и его локализации,параметр Location указывает непосредственно на расположение.

Например
Код:
{7be9d83c-a729-4d97-b5a7-1b7313c39e0a}
Является program files,из значения

Код:
HKCR\CLSID\{7be9d83c-a729-4d97-b5a7-1b7313c39e0a}\MergedFolder\Location\@shell32.dll,-4177
Мы понимаем что папка сопряжена с @shell32.dll,-4177 что значит "Текущий пользователь".

Далее.


ShellFolder с параметром Attributes, значение, к примеру, 0x28100000 (672137216)
О чем нам говорит этот атрибут?
В данном случае я не вижу к какому объекту он относится,но в приведенном мной примере значение будет такое же значение.

Но данное значение лишь указывает на несколько флагов:

Данный элемент есть папка
Указанный элемент может быть размещен внутри веб-браузера или проводника Windows визуально.
Чушь какая - то типа этим элементам не присвоен определенный номер и они могут быть скрыты...(???)

Вот примерная расшифровка флага.
Про элементы-я думаю имеется ввиду то,что каждая папка или объект могут иметь номер,например

0x0004 / / Мой компьютер \ Принтеры

Вот давно уже не могу собраться флаги оформить,такая тема тернистая...Dragokas, формируй остальные вопросы если есть и пойдет инфа в переработку...
 
Последнее редактирование:

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
5,623
Симпатии
5,504
#8
Если вы хотите использовать глобальные идентификаторы (GUID) для идентификации ваших файлов, то никто вас не останавливает
Обратите внимание, что после того, как вы получили глобальный идентификатор для файла, вы можете переместить его в любое место диска, и функция OpenFileById по-прежнему будет открывать его.
Неплохо, да?
 

Кирилл

Команда форума
Администратор
Сообщения
13,298
Симпатии
5,849
#9
Дабы не терять смысловую нагрузку некоторых моментов не стал переделывать а просто добавил ссылку на эту тему.
 

Hunter23071985

Новый пользователь
Сообщения
1
Симпатии
2
#12
Создать и зарегистрировать в ОС GUID для любого файла или папки можно простым батником:
CMD/BATCH:
@Echo off

:: НАИМЕНОВАНИЕ ПАПКИ ИЛИ ПРОГРАММЫ
Reg.exe add "HKLM\SOFTWARE\Classes\CLSID\{77680c55-563c-4b37-ac69-5d283935a742}" /v "" /t REG_SZ /d "Cursors" /f

:: ПУТЬ К ПАПКЕ ИЛИ ФАЙЛУ ПРОГРАММЫ
Reg.exe add "HKLM\SOFTWARE\Classes\CLSID\{77680c55-563c-4b37-ac69-5d283935a742}\Shell\Open\Command" /v "" /t REG_SZ /d "Explorer /n, /e, C:\Windows\Cursors" /f

:: ПУТЬ К ИКОНКЕ ДЛЯ ЯРЛЫКА
Reg.exe add "HKLM\SOFTWARE\Classes\CLSID\{77680c55-563c-4b37-ac69-5d283935a742}\DefaultIcon" /v "" /t REG_SZ /d "%%SystemRoot%%\system32\SHELL32.dll,4" /f

:: ПРИМЕР ЗАПУСКА
:: shell:::{77680c55-563c-4b37-ac69-5d283935a742}, в {} - GUID, созданный в https://www.guidgen.com
 
Сверху Снизу