201

Re: WSH: обмен данными и объектами между скриптами — 2

teadrinker пишет:

Так как объект с CLSID {C08AFD90-F2A1-11D1-8455-00A0C91F3880} — это обычный объект Shell Window, то в качестве подобного контейнера может быть использовано любое существующее окно Проводника, например Рабочий стол. Я не владею WSH, поэтому пример на AHK (который, думаю, легко переписать на vbs).
Первый скрипт:

#Requires AutoHotkey v2
Persistent

VT_UI4 := 0x13, SWC_DESKTOP := 0x8
shellWindows := ComObject('Shell.Application').Windows
desktopShellWindow := shellWindows.Item(ComValue(VT_UI4, SWC_DESKTOP))
desktopShellWindow.PutProperty('myObj', {key: 'Hello!'})

Второй скрипт:

#Requires AutoHotkey v2

VT_UI4 := 0x13, SWC_DESKTOP := 0x8
shellWindows := ComObject('Shell.Application').Windows
desktopShellWindow := shellWindows.Item(ComValue(VT_UI4, SWC_DESKTOP))
MsgBox desktopShellWindow.GetProperty('myObj').key

Одна проблема: если Проводник перезапустить, данные будут потеряны.

Так это и было понятно с первого раза. Передача инфы только через память локального компа на котором крутятся скрипты.
Поэтому  с сетью "такое" не прокатит. Хотя как утверждает Микрософт "сериализация" их  такое может сделать

202

Re: WSH: обмен данными и объектами между скриптами — 2

Если было понятно "с первого раза", то зачем создавать новый объект Shell Window, когда Рабочий стол всегда имеется?

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

203

Re: WSH: обмен данными и объектами между скриптами — 2

teadrinker Так у вас тоже организуется ссылка на рабочий стол. И в том скрипте у НЕГО, тоже также. А вот поиск у НЕГО той проги которая задействована для передачи осуществляется через поиск атрибута, записанного как метка в 1.vbs. С вашим рабочий столом никакой проверки не надо делать вообще. На тот момент наверное не было вообще представление того что у всех СОМ микрософта есть этот GetProperty. Но возможно на тот момент у микрософта не было ещё у  рабочего стола этого. Со временем всё меняется, всё развивается.

204

Re: WSH: обмен данными и объектами между скриптами — 2

3wedsmncjklvjvd73734 пишет:

Так у вас тоже организуется ссылка на рабочий стол. И в том скрипте у НЕГО, тоже также.

Судя по всему, вы так и не поняли, что происходит в скрипте. В изначальном скрипте создаётся новое окно, скрытое (и никакой ссылки на рабочий стол там нет), а я использую существующее, в этом разница.

3wedsmncjklvjvd73734 пишет:

На тот момент наверное не было вообще представление того что у всех СОМ микрософта есть этот GetProperty

Почему у всех, только у Shell Window, который реализует IWebBrowser2 interface.

3wedsmncjklvjvd73734 пишет:

Но возможно на тот момент у микрософта не было ещё у  рабочего стола этого

Это маловероятно, Рабочий стол — это такое же окно, как и другие окна Проводника, и его объект Shell Window также реализует IWebBrowser2.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

205 (изменено: 3wedsmncjklvjvd73734, 2025-09-15 08:43:51)

Re: WSH: обмен данными и объектами между скриптами — 2

Мне кажется что я кое что придумал как, связывать между собой машины в иннете с работающими там vbs-ками которые будут передавать друг другу данные.
Есть такой постоянный работающий сервис как "Алиса".
Вот её я и предлагаю использовать как перевалочную станцию для данных.
-->
сама алиса hxxps://dialogs.yandex.ru/
и что нам предлагают в яндексе, как программерам
hxxps://yandex.ru/dev/dialogs/alice/doc … rogramming
...
конечно нужно будут вносить свои данные при регистрации. Но зато "передавай/получай" 24/7  - нет проблем.
Но есть и другие бесплатные сервисы, работающие 24/7 в иннете, и не только алиса.


teadrinker
Я переписал  на VBS вашу версию с "рабочим столом" .
Она (ваша версия) с "рабочим столом" пашет так же как и с проводником.
файл 1.vbs


Option Explicit
Class GlobalObject
    Private ShellWindow, ShellWindows

    Sub OpenContainer(name)
        Dim ShellWindows
        Set ShellWindows = CreateObject("Shell.Application").Windows
        For Each ShellWindow in ShellWindows
            if Instr(1,ShellWindow.StatusText,name) = 1 Then Exit Sub
        Next
'        Set ShellWindow = GetObject("new:{C08AFD90-F2A1-11D1-8455-00A0C91F3880}") 
' - в версии с рабочим столом не создавать новый объект (рабочий стол)
        Set ShellWindow = GetObject("{00021400-0000-0000-C000-000000000046}")
        ShellWindow.StatusText = name
    End Sub
    
    Property Let Value(name, newValue)    
        ShellWindow.PutProperty name, newValue
    End Property
    
    Public Default Property Get Value(name)
        On Error Resume Next
        if IsObject(ShellWindow.GetProperty(name)) Then
            Set Value = ShellWindow.GetProperty(name)
        Else
            Value = ShellWindow.GetProperty(name)
        End if
    End Property
End Class


Dim GlobalObj, fso
Set GlobalObj = New GlobalObject

set fso = CreateObject("Scripting.FileSystemObject")

GlobalObj.OpenContainer "storage"
GlobalObj("test") = InputBox("Введите значение для глобальной переменной ""test"".")
GlobalObj("fso") = fso

MsgBox "Значения установлены. Теперь, не закрывая это сообщение, запустите 2.vbs"

...
файл 2.vbs


Option Explicit
Class GlobalObject
    Private ShellWindow, ShellWindows

    Sub OpenContainer(name)
        Dim ShellWindows
        Set ShellWindows = CreateObject("Shell.Application").Windows
        For Each ShellWindow in ShellWindows
            if Instr(1,ShellWindow.StatusText,name) = 1 Then Exit Sub
        Next
'        Set ShellWindow = GetObject("new:{C08AFD90-F2A1-11D1-8455-00A0C91F3880}")
' - в версии с рабочим столом не создавать новый объект (рабочий стол)
        Set ShellWindow = GetObject("{00021400-0000-0000-C000-000000000046}")

        ShellWindow.StatusText = name
    End Sub
    
    Property Let Value(name, newValue)    
        ShellWindow.PutProperty name, newValue
    End Property
    
    Public Default Property Get Value(name)
        On Error Resume Next
        if IsObject(ShellWindow.GetProperty(name)) Then
            Set Value = ShellWindow.GetProperty(name)
        Else
            Value = ShellWindow.GetProperty(name)
        End if
    End Property
End Class

dim GlobalObj
Set GlobalObj = New GlobalObject

GlobalObj.OpenContainer "storage"
MsgBox "Значение переменной ""test"": " & GlobalObj("test") ,vbInformation
MsgBox "Тип переменной ""fso"": " & TypeName(GlobalObj("fso")),vbInformation

ремарка.
teadrinker
Спасибо огромное ВАМ, что помогли нам тут с этим вопросом и нашли простой способ работающего сервиса  "рабочий стол",
который является ключевым в винде и мало вероятно что он сбойнёт и вся инфа потеряется.