26

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

Xameleon пишет:

2 alexii: Ммм. Наверное лучше допишем и в коллекцию перенесём. )

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

27

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

Ну, что?) Теперь потоки на JS создавать можно:)

28

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

2 alexii:
OFF: Как пожелаете. )

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

29

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

Xameleon, это было только предложение. Решать в любом случае, как автору, Вам.

30 (изменено: Xameleon, 2011-03-11 02:13:26)

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

2 alexii:

OFF: Вот я и решил, что согласен. ) Так искать будет проще потом.

Сейчас с JSman-ом обсудил варианты развития темы. Думаю скоро выложим ещё пару интересных примеров. Надеюсь, остальные участники тоже покреативят. )

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

31

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

Я вот так переделал, но пример отличный.

Большое спасибо тебе Xameleon, давно что-то подобное ищу.

1.vbs

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}")
        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

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}")
        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

Set GlobalObj = New GlobalObject

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

32 (изменено: Xameleon, 2011-03-11 11:55:03)

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

2 atomix: Как ни странно, но я как раз с этого кода и начал. Только у меня было не Value, а Item Но меня смутил последующий метод присвоения объекта. Передавать его без Set меня напрягает.

GlobalObj("fso") = fso

А если уж делать через Set, то нужно отдельно описывать ещё и Property Set

Property Set Value(name, newValue)    
    ShellWindow.PutProperty name, newValue
End Property

В общем это меня и побудило на использование PutProperty и SetProperty. Вдобавок у самого объекта эти методы так реализованы. 

В кратце - чисто психологические заморочки. )

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

33

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

Xameleon,

Win 2000 + SP4, IE6 - работает нормально.

Спасибо - вещь изящная и очень нужная.

34

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

Для удобства объединил коды из поста №19 в один файл:

function GlobalObject(Name)
{    
    if(!Name)Name="GlobalObject";
    if (this.Window = this.FindWindow(Name))null;else
    {
        this.Window = GetObject("new:{C08AFD90-F2A1-11D1-8455-00A0C91F3880}");
        this.Window.StatusText = Name;
    }
}

GlobalObject.prototype = 
{
    FindWindow : function (Name)
    {
        var  ShellWindows=(new ActiveXObject("Shell.Application")).Windows();
        for (var i=ShellWindows.Count; --i>=0;)
        if (ShellWindows.Item(i).StatusText && ShellWindows.Item(i).StatusText.indexOf(Name)!=-1) 
        return ShellWindows.Item(i);
    },
    
    GetProperty: function (Name)
    {
/* 23 */        return this.Window.GetProperty(Name);
    },
    
    SetProperty: function (Name, Value)
    {
        this.Window.PutProperty(Name, Value);
    }

}

if ( WScript.Arguments.Named.Exists('1') ) {
    var g = new GlobalObject();
    g.SetProperty("Host", this);
    while (1) WScript.Sleep(10);
}

if ( WScript.Arguments.Named.Exists('2') ) {
    var g = new GlobalObject(), host;
    if (host = g.GetProperty("Host")) 
/* 42 */    {WScript.Echo("Связь установлена. Теперь закроем чужой процесс.");host.WScript.Quit();} else WScript.Echo("Связь не установлена")
}

.
Тест 1. Запускаем "инициализатор" затем "связного"

C:\PROGS\SCRIPTS\JavaScript\GlobalObject>cscript //nologo GlobalObject.js /1

C:\PROGS\SCRIPTS\JavaScript\GlobalObject>cscript //nologo GlobalObject.js /2
Связь установлена. Теперь закроем чужой процесс.

.
Тест 2. Через несколько секунд (до 1-2-3 минут) запускаем только "связного"

C:\PROGS\SCRIPTS\JavaScript\GlobalObject>cscript //nologo GlobalObject.js /2
Связь установлена. Теперь закроем чужой процесс.
C:\PROGS\SCRIPTS\JavaScript\GlobalObject\GlobalObject.js(42, 68) Microsoft JScript runtime error: The remote server machine does not exist or is unavailable

.
Тест 3. Через более продолжительное время запускаем опять только "связного"

C:\PROGS\SCRIPTS\JavaScript\GlobalObject>cscript //nologo GlobalObject.js /2
C:\PROGS\SCRIPTS\JavaScript\GlobalObject\GlobalObject.js(23, 9) Microsoft JScript runtime error: The remote server machine does not exist or is unavailable

Соответтствующие номера строк выставил в комментариях в начале строк.

( 2 * b ) || ! ( 2 * b )

35

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

2 Rumata: Да. Есть некоторые "косяки". ) Связь с объектами пропадает не сразу. Как эти механизмы "лечить" надо подумать.

P.S Всё же HACK технология. Винда то и не думала, что её вывернут наизнанку и через её родные окошки будут данными кидаться.

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

36

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

JSman пишет:

Ну, что?) Теперь потоки на JS создавать можно:)

Можно поподробнее, как?

37

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

2 mikser: Из того, что JSman объяснял мне при личной переписке - он имел в виду создание двух и более отдельных процессов. Т.е грубо говоря 2,3,4... процесса WScript.exe связанные через этот объект, выполняющие одну логическую задачу.

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

38 (изменено: mikser, 2011-03-24 17:47:07)

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

Xameleon, COM обёртки у WScript нету?
Что бы не создавать процесс WScript в лоб, а через new ActiveXObject("WScript.что то там") ?

39

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

В общем, что касается потоков, то собираюсь на днях опубликовать код, который позволит делать вот такую штуку:

var worker = new Thread(Code, ObjectName, ObjectPointer, Language);
worker.attachEvent("oncomplete", callback);

Таким образом, трудоемкую часть кода можно вынести в отдельный процесс, снимая нагрузку с основного скрипта.

40

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

mikser пишет:

Xameleon, COM обёртки у WScript нету?
Что бы не создавать процесс WScript в лоб, а через new ActiveXObject("WScript.что то там") ?

К сожалению нет. ) (ну или пока я её (COM обёртку) не нашёл)

На "вражеских" форумах и в блоге одно из разработчиков я видел подобный вопрос. Но везде ответ приблизительно такой - "ДА КАК ВАМ В ГОЛОВУ ТАКОЕ ПРИШЛО ?! ЗАЧЕМ ЭТО НУЖНО ?!" )) На что у меня возникает логичный ответ - "Ну раз спрашиваем ! Значит нужно !".

В общем подумаем, подумаем. Может и родим. ) На самом деле классид WScript-а известен.

[
  uuid(60254CA2-953B-11CF-8C96-00AA00B8708C),
  helpstring("Windows Script Host Object")
]
coclass IHost_Class {
    [default] interface IHost;
};

Но создать его как самостоятельный объект к сожалению нельзя. )

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

41 (изменено: kaster, 2011-03-25 13:22:00)

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

Вариант на AutoIt
1.au3


$oContainer = OpenContainer("storage")
PutProperty($oContainer, "test", InputBox('', 'Введите значение для глобальной переменной "test".'))
$oFSO = ObjCreate("Scripting.FileSystemObject")
PutProperty($oContainer, "fso", $oFSO)

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

Func OpenContainer($sName)
    Local $oShell, $oShellWindow, $oShellWindows
    $oShell = ObjCreate("Shell.Application")
    $oShellWindows = $oShell.Windows
   
    For $oShellWindow In $oShellWindows
        If StringInstr($oShellWindow.StatusText, $sName) Then
            Return $oShellWindow
        EndIf
    Next
   
    $oContainer = ObjGet("new:{C08AFD90-F2A1-11D1-8455-00A0C91F3880}")
    $oContainer.StatusText = $sName
   
    Return $oContainer
EndFunc

Func PutProperty($oContainer, $sName, $vValue)
    $oContainer.PutProperty($sName, $vValue)
EndFunc

Func GetProperty($oContainer, $sName)
    Return $oContainer.GetProperty($sName)
EndFunc

2.au3


$oContainer = OpenContainer("storage")
PutProperty($oContainer, "test", InputBox('', 'Введите значение для глобальной переменной "test".'))
$oFSO = ObjCreate("Scripting.FileSystemObject")
PutProperty($oContainer, "fso", $oFSO)

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

Func OpenContainer($sName)
    Local $oShell, $oShellWindow, $oShellWindows
    $oShell = ObjCreate("Shell.Application")
    $oShellWindows = $oShell.Windows
   
    For $oShellWindow In $oShellWindows
        If StringInstr($oShellWindow.StatusText, $sName) Then
            Return $oShellWindow
        EndIf
    Next
   
    $oContainer = ObjGet("new:{C08AFD90-F2A1-11D1-8455-00A0C91F3880}")
    $oContainer.StatusText = $sName
   
    Return $oContainer
EndFunc

Func PutProperty($oContainer, $sName, $vValue)
    $oContainer.PutProperty($sName, $vValue)
EndFunc

Func GetProperty($oContainer, $sName)
    Return $oContainer.GetProperty($sName)
EndFunc

Автор реализации: Creator

autoit@conference.jabber.ru - Конференция скриптового языка AutoIt на jabber.ru

42 (изменено: mikser, 2011-03-25 23:02:37)

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

OFF: Наткнулся на интересный  COM объектик, Который может добавить многопоточность в скрипты.
COMScriptThread

Name Description
Start Starts the thread with the given script
Execute If the thread is started and in stand-by executes the given routine from the loaded script.
Stop Stops the thread.
Wait Waits for the thread to complete the current operation.
Value Default property: Holds a VarDictionary based collection (dictionary) that is accessible for the both - the application creating the thread and the script in the thread.
Busy Boolean: indicates if the thread is busy.
AddCreator Boolean: If set the running script in the thread will have a Pack1Creator object accessible through the Creator namespace.
LastError String: Contains the last error
MultiThreaded Boolean: If set (default) the thread will be initialized as multithreaded COM apartment.
Priority Integer: The thread priority
Result Variant: The result of the last routine execution (meaningful if the routine is a function)
Success Boolean: Indicates if the last operation was successful (routine execution, thread start)
Timeout Positive integer: Timeout for the internal wait operations.
Active Indicates if the thread is active (Busy or stand by)

43

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

Фи. Сторонняя разработка. Не системный COM. Не айс. ) Если делать стороннюю - то я уж лучше сам соберу. По крайней мере буду точно знать где накосячил. )

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

44

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

Xameleon
Просим! Многопоточности скриптовым языкам очень не хватает (имею в виду AutoIt. Но думаю, AHK тоже, а вот на Python есть свою либа, как мне известно).

autoit@conference.jabber.ru - Конференция скриптового языка AutoIt на jabber.ru

45

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

Да собственно всё уже решено до нас - WshController. Не очень удобно, ибо требует настройки на локальном компе. Но куда уж многопоточнее ? ) Либо ScriptControl как вариант.

Можно и своё нагородить. Но хоть убейте - не вижу смысла.

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

46

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

Угу. Если задуматься — зачем? — то реальных приложений, не просто требующих многопоточности, а и умеющих её использовать — раз-два и обчёлся.

47

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

alexii, из практики. После создания GUI, если скрипт занят чем-то (к примеру, обработкой большого файла), то сам GUI уже ни на что не реагирует. Если повесить прорисовку графики на один поток, все остальное на другой - проблема решается. Более того, можно начать обрабатывать другой файл, к примеру. Я уже не говорю, про индикацию прогресса. Наверняка, у многих (по крайней мере, на соответствующем форуме) возникали индивидуальные требования так или иначе требующие многопоточности. Я лично все свои подобные проблемы решил использовав Python, т.к. там есть модуль threading.

autoit@conference.jabber.ru - Конференция скриптового языка AutoIt на jabber.ru

48

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

kaster пишет:

alexii, из практики. После создания GUI, если скрипт занят чем-то (к примеру, обработкой большого файла), то сам GUI уже ни на что не реагирует. Если повесить прорисовку графики на один поток, все остальное на другой - проблема решается. Более того, можно начать обрабатывать другой файл, к примеру. Я уже не говорю, про индикацию прогресса.

Отчасти согласен. Но я имел в виду несколько иное — саму обработку (GUI в AutoIt — частный случай, и, в принципе, не слишком критичный — обработку можно вынести даже в отдельное приложение).

49

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

alexii, да, какие только костыли я не пробовал Если повесить обработку графики на отдельный скрипт, код нагромождается необходимостью (грамотной) организации обменом данных между двумя скриптами. Я, к примеру, про метод обсуждаемый в данной теме не знал. Посему это дело забросил. Но в любом случае, если будет возможность сделать такое относительно простыми способами, как мультипоточность, никто против не будет

autoit@conference.jabber.ru - Конференция скриптового языка AutoIt на jabber.ru

50 (изменено: mikser, 2011-03-29 04:23:42)

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

Xameleon пишет:

Но хоть убейте - не вижу смысла.

Жаль а мне бы она щас не помешала. Я сегодня окончательно осознал как применять LibCurl в среде JScript через DynamicWrapperX
проблема осталась лишь в том, что все запросы в курле синхроные а для асинхроных запросов авторы курла советуют юзать потоки.

Фи. Сторонняя разработка. Не системный COM. Не айс. )

Зато бесплатная. А системные комы тоже не всегда айс,  и их исходников у вас нету.
Скорей всего в системных комах косяков не меньше чем в сторонних разработках.

Xameleon пишет:

Либо ScriptControl как вариант.

Не знал, что он это позволяет, а можно пример многопоточности через ScriptControl?