Automation a ruby plugin

Hlášení chyb a problémů programu Altap Salamander. Buďte, prosím, ve svých popisech co nejpodrobnější a vytvořte pro každý incident nový příspěvek. Nevkládejte programem generovaná hlášení o pádu programu, pošlete je e-mailem.
manison
Plugin Developer
Plugin Developer
Posts: 216
Joined: 09 Dec 2005, 23:23
Location: Ceske Budejovice, Czech Republic
Contact:

Re: Automation a ruby plugin

Post by manison »

Po několika iteracích s vývojářem mám funkční verzi pro můj testovací system winXP 32bit (podrobnosti sepíši později sem). Mám funkční RScript.dll knihovnu a windows pozná a spustí jak xml soubor (*.wsf) v němž je ruby i funguje normální spouštění přes wscript a cscript. Jenom Automation plugin nerozpozná cestu, pro .rb file, když je dám do plugin adresáře.
Tak to je dost zvláštní. Automation opravdu nepotřebuje nic víc, než výše uvedené záznamy v registru. Spustí se vám skript přes cscript/wscript i po double kliku na soubor s příponou .rb? Rozhodující pro Automation je asociace enginu přes příponu. V předchozím příspěvku s výpisem registru máte pravděpodobně chybu, ale předpokládám, že je to jenom překlep, jinak by to vůbec nefungovalo:

[HKCR\.rb]@="RubyScriptFile"
[HKCR\RubyScript\ScriptEngine]@="RubyScript" má být spíš [HKCR\RubyScriptFile\ScriptEngine]@="RubyScript"
[HKCR\RubyScript\CLSID]@="{456A3763-90A4-4F2A-BFF1-4B773C1056EC}"
[HKCR\CLSID\{456A3763-90A4-4F2A-BFF1-4B773C1056EC}\InprocServer32]@="c:\Ruby-2.2\bin\RScript22.dll"


Odkud jste instaloval Ruby Script 2.2? Když instaluji z http://www.artonx.org/data/asr/Ruby-2.2.msi, tak se mi asociace na příponu .rb v registru vůbec nevytvoří. Doplňujete něco ručně?
Lze nějak jednoduše ověřit všechny cesty co Automation plugin vidí?
Cesty, ve kterých Automation hledá skripty, se nastavují v konfiguraci pluginu (Plugins > Plugins Manager > Automation > Configure). Můžete ale v panelu najet na soubor .rb a v Automation menu zvolit "Run focused script". Pokud je vše správně v registru, měla by být tato položka v menu pro soubory .rb povolena (nevyšednutá).
User avatar
tukanos
Posts: 410
Joined: 21 Dec 2005, 19:14

Re: Automation a ruby plugin

Post by tukanos »

Tak to je dost zvláštní. Automation opravdu nepotřebuje nic víc, než výše uvedené záznamy v registru. Spustí se vám skript přes cscript/wscript i po double kliku na soubor s příponou .rb? Rozhodující pro Automation je asociace enginu přes příponu. V předchozím příspěvku s výpisem registru máte pravděpodobně chybu, ale předpokládám, že je to jenom překlep, jinak by to vůbec nefungovalo:

[HKCR\.rb]@="RubyScriptFile"
[HKCR\RubyScript\ScriptEngine]@="RubyScript" má být spíš [HKCR\RubyScriptFile\ScriptEngine]@="RubyScript"
[HKCR\RubyScript\CLSID]@="{456A3763-90A4-4F2A-BFF1-4B773C1056EC}"
[HKCR\CLSID\{456A3763-90A4-4F2A-BFF1-4B773C1056EC}\InprocServer32]@="c:\Ruby-2.2\bin\RScript22.dll"
Cesta v registrech vypadá být dobře - při kliknutí na soubor .rb se normálně spustí. Je to mix toho co jsem vypozoroval a vyzkoušel cestou hokus-pokus.
Ano, všimnul jste si správně, že jsem to napsal špatně, ta cesta je skutečně tato:
[HKCR\.rb]@="RubyScriptFile"
[HKCR\RubyScriptFile\ScriptEngine]@="RubyScript"
[HKCR\RubyScript\CLSID]@="{456A3763-90A4-4F2A-BFF1-4B773C1056EC}"
[HKCR\CLSID\{456A3763-90A4-4F2A-BFF1-4B773C1056EC}\InprocServer32]@="c:\Ruby-2.2\bin\RScript22.dll"


Odkud jste instaloval Ruby Script 2.2? Když instaluji z http://www.artonx.org/data/asr/Ruby-2.2.msi, tak se mi asociace na příponu .rb v registru vůbec nevytvoří. Doplňujete něco ručně?

Instalačka 2.2 skutečně nic nemění, na té jsem testoval, jak to funguje. Mám k tomu upravenou knihovnu od vývojáře a přidávám si záznamy do registrů .

Arton, vývojář, dnes vydal opravu pro ruby-2.3x64 (http://www.artonx.org/data/asr/Ruby-2.3-x64.msi) i 2.3x86 (http://www.artonx.org/data/asr/Ruby-2.3.msi). Ještě jsem to netestoval, ale dnes mě psal, že to opravil a vydal. Tak to ještě musím dotestovat.

Lze nějak jednoduše ověřit všechny cesty co Automation plugin vidí?
Cesty, ve kterých Automation hledá skripty, se nastavují v konfiguraci pluginu (Plugins > Plugins Manager > Automation > Configure). Můžete ale v panelu najet na soubor .rb a v Automation menu zvolit "Run focused script". Pokud je
vše správně v registru, měla by být tato položka v menu pro soubory .rb povolena (nevyšednutá).


Aha, tak to je vyšednuté. Udělal jsem si o něco složitější skript, než jen nějaké vypsání a to dvakrát kliknutím nelze spustit, ale přes wscript to spustit jde, možná tam bude zakopán pes.

Spustím tohle:

Code: Select all

wscript WSH_ruby_Identification_Script.rb
A skript vyhodí:
WSH_ruby_sample.jpg
WSH_ruby_sample.jpg (36.7 KiB) Viewed 19393 times
Při dvojkliku se tohle nespustí... (ostatní jednoduché .rb se spustí. Možná až tohle dohledám tak to bude fungovat. Zkusím si to ještě projít od začátku.)
User avatar
tukanos
Posts: 410
Joined: 21 Dec 2005, 19:14

Re: Automation a ruby plugin

Post by tukanos »

Tak mohu KONEČNĚ hlásím úplný úspěch v testovací verzi. Díky moc Manisonovi (http://forum.altap.cz/memberlist.php?mo ... ofile&u=27) za jeho trpělivost. Co jsem pořád nechápal bylo jak se to má chovat. Pak jsem si uvědomil, že se skript musí chovat jako .exe soubor ve windows a vše šlo hned lépe.
Při dvojkliku se tohle nespustí... (ostatní jednoduché .rb se spustí. Možná až tohle dohledám tak to bude fungovat. Zkusím si to ještě projít od začátku.)
Zde byl skutečně zakopán pes.

Začal bych tím, kde byl zakopán pes úplně na konci, pak bych to shrnul pro verzi ruby 2.2 (s opravenou knihovnou od vývojáře a vlastními klíči v registrech) (verzi 2.3 budu ještě testovat).

Posledním problémem který jsem měl byl v registrech:

Code: Select all

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.rb
Musel jsem smazat link na rubyw.exe a upravit OpenWithProgids, aby směřovalo na RubyScriptFile.
Měl jsem uvedeno následující (OpenWithList se může z vesela ignorovat):

Code: Select all

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.rb]
"Application"="rubyw.exe"

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.rb\OpenWithList]
"a"="ruby.exe"
"MRUList"="bdaec"
"b"="salamand.exe"
"c"="VMwareHostOpen.exe"
"d"="rubyw.exe"
"e"="Notepad.exe"

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.rb\OpenWithProgids]
"RubyFile"=hex(0):
"RubyScriptFile"=hex(0):
"RubyScript"=hex(0):
A správně by mělo být:

Code: Select all

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.rb]

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.rb\OpenWithList]
"a"="ruby.exe"
"MRUList"="bdaec"
"b"="salamand.exe"
"c"="VMwareHostOpen.exe"
"d"="rubyw.exe"
"e"="Notepad.exe"

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.rb\OpenWithProgids]
"RubyScriptFile"=hex(0):
Správné registry připojuji k tomuto textu -
rubyscript_correct_registry.zip
(2.74 KiB) Downloaded 333 times
Knihovnu RScript.dll k Ruby 2.2
RScript22_working_dll.zip
(97.94 KiB) Downloaded 349 times
Je nutné provést pár kroků k ohlášení knihovny a jejímu opětnému přihlášení (Toto by nemělo být zapotřebí u Ruby 2.3 x86 či x64 - ještě jsem netestoval.)

Code: Select all

1. cd c:\ruby-2.2.0\bin
2. regsvr32 /u RScript22.dll (původní knihovna se odregistruje)
3. Nahrání nové RScript22.dll z přílohy
4. regsvr32 RScript22.dll (registrace nové knihovny)
Ještě bych si dovolil uvést kód založený na Manisonově původním test skriptu (opravil jsem věci co neprojdou v nových ruby - např. velké písmeno v proměnné (je to bráno jako konstanta) a dále jsem to trochu rub(y)al):
Funkční skript pro nové ruby a automation plugin promocí COM

Code: Select all

total_size = 0
Salamander.SourcePanel.Items.each { |item| total_size += item.size }
Salamander.MsgBox("Total size of all items in the panel: #{total_size.to_s} bytes", 0, 'File Size in Dir')
Tady je šťastný výsledek usilovné práce (a ano, už to nepadá a normálně vždy funguje):
ruby_scirpt_via_automatization_plugin.jpg
ruby_scirpt_via_automatization_plugin.jpg (200.56 KiB) Viewed 19354 times
manison
Plugin Developer
Plugin Developer
Posts: 216
Joined: 09 Dec 2005, 23:23
Location: Ceske Budejovice, Czech Republic
Contact:

Re: Automation a ruby plugin

Post by manison »

Díky za informace a sdílení zkušeností. Dejte vědět, jak to dopadlo s verzí 2.3.
User avatar
tukanos
Posts: 410
Joined: 21 Dec 2005, 19:14

Re: Automation a ruby plugin

Post by tukanos »

manison wrote:Díky za informace a sdílení zkušeností. Dejte vědět, jak to dopadlo s verzí 2.3.
Tak jsem si našel trochu času pohrát si s verzí 2.3 (jak x86 tak i x64). Dosáhl jsem stavu, že jak v salamandru x86 a x64 vidím skripty v listu.

Když spustím skript, tak se naprosto nic neprovede, zkoušel jsem salamander v normálním stavu i v administrátorském a žádnou změnu to nepřineslo. Dělal jsem si analýzu pomocí procmon(u) od sysinternals a porovnával jsem verzi Windows XP (kde to funguje) s Windows 7.

Ve windows 7 se pustí pouze Thread create a hned potom Thread exit. Nic takového jsem ve fungujících windows XP nenašel, tam jsem našel řetezce dotazujících se na InprocServer32 a správné vykonání COM.

Rád bych se zeptal, zda je nějaké omezení na cestu v InprocServer32, která ukazuje na cestu, protože nyní mám C:\prg_sdk\rubies\Ruby-2.3-x64_arton\bin\RScript22.dll a nejsem si jist jestli tam nedochází k nějakým problémům. I když tu knihovnu to najde, protože když jsem si to zkoušel prohodit za jinou cestu, tak to okamžitě nahlásilo problémy.

Další dotaz co bych rád vznesl je otázka zabezpečení COM ve windows 7 ve vztahu k externímu Ruby. Dostal jsem se do nastavení Component Services a tady úplně nevím jestli bych měl něco nastavit pro umožnení spoušetění COM externí knihovně.
User avatar
tukanos
Posts: 410
Joined: 21 Dec 2005, 19:14

Re: Automation a ruby plugin

Post by tukanos »

Pokračuji zde z vlákna Velikost ikon na velkých monitorech, abychom neznásilňovali jiné vlákno fóra:
manison wrote:
tukanos wrote:…když jsem rozchodil ruby jako prostředí narazil jsem na padání automation pluginu v případě, že našel unicode znak a tudíž to bylo pro mé potřeby nepoužitelné.
Nějaký konkrétní příklad? Třeba by to šlo řešit na straně Automation pluginu. Pokračujte případně oživením vlákna Automation a ruby plugin.
Jistě snažím se vždy tvrdit to co jsem si odzkoušel nebo mohu jinak dokázat.). Můžete si zkusit spustit můj plugin Automation and ruby - listing largest files a pokud se v cestě vyskytuje v cestě vyskytuje soubor který má název v unicode, tak to jednoduše spadne a vyhledávání se přeruší (přiznávám se, že jsem více pokusů nedělal protože vím, že Salamander není uvnitř unicode.) a program nedoběhne.

Přikládám screenshot:
Attachments
automation_listing_fails.jpg
automation_listing_fails.jpg (235.99 KiB) Viewed 18317 times
Last edited by tukanos on 12 Jan 2017, 11:58, edited 1 time in total.
manison
Plugin Developer
Plugin Developer
Posts: 216
Joined: 09 Dec 2005, 23:23
Location: Ceske Budejovice, Czech Republic
Contact:

Re: Automation a ruby plugin

Post by manison »

Ten skript uniknul mé pozornosti, zkusím ho spustit. Jakou verzi Ruby enginu jste použil? 2.3? x86 nebo x64? Můžete nasdílet odkaz ke stažení konkrétní Vámi testované verze? Všiml jsem si, že ve skriptu používáte Scripting.FileSystemObject. Ten by měl podporovat Unicode a obcházet Salamandera.
User avatar
tukanos
Posts: 410
Joined: 21 Dec 2005, 19:14

Re: Automation a ruby plugin

Post by tukanos »

manison wrote:Ten skript uniknul mé pozornosti, zkusím ho spustit. Jakou verzi Ruby enginu jste použil? 2.3? x86 nebo x64? Můžete nasdílet odkaz ke stažení konkrétní Vámi testované verze? Všiml jsem si, že ve skriptu používáte Scripting.FileSystemObject. Ten by měl podporovat Unicode a obcházet Salamandera.
Používal jsem 2.2 (tu jsem měl opatchovanou od vývojáře) a 2.3, x86 verzi a Windows XP (ve windows 7 x64 to nefunguje zatím zcela spolehlivě a je to nejspíše záležitost registrů - některé test scripty fungují ). Teoreticky by to mělo fungovat jak na x86 tak i x64 na windows 7.
manison
Plugin Developer
Plugin Developer
Posts: 216
Joined: 09 Dec 2005, 23:23
Location: Ceske Budejovice, Czech Republic
Contact:

Re: Automation a ruby plugin

Post by manison »

Zkouším poslední dostupnou verzi 2.4 (x86). Po drobné úpravě na straně Automation pluginu se při spuštění Vašeho skriptu dostávám na chybu

Code: Select all

---------------------------
Error
---------------------------
Error running the script.
Error output: uninitialized constant #<Class:0xc7a8800>::LargestFiles::Salamander
---------------------------
[OK]
---------------------------
Tušíte, co by to mohlo být?
User avatar
tukanos
Posts: 410
Joined: 21 Dec 2005, 19:14

Re: Automation a ruby plugin

Post by tukanos »

manison wrote:Zkouším poslední dostupnou verzi 2.4 (x86). Po drobné úpravě na straně Automation pluginu se při spuštění Vašeho skriptu dostávám na chybu

Code: Select all

---------------------------
Error
---------------------------
Error running the script.
Error output: uninitialized constant #<Class:0xc7a8800>::LargestFiles::Salamander
---------------------------
[OK]
---------------------------
Tušíte, co by to mohlo být?
Paráda, že jste upravil ten Automation plugin tak, že to spustíte, to mám radost a rád bych si to posléze i zkusil.

Ano tuším kde by mohl být pravděpodobně problém. Ve skriptu používám objekt Salamander např. Salamander.MsgBox; Salamander.InputBox; Salamander.SourcePanel.path atd. Ten objekt ale není instanciován a nespíše to spadne při použití první metody.
Triviální příklad:

Code: Select all

 
 class ConstClass
    |   C1=101
    |   C2=102
    |   C3=103
    |   def show
    |     print C1," ",C2," ",C3,"\n"
    |   end
    | end
   nil
ruby> C1
ERR: (eval):1: uninitialized constant C1
ruby> ConstClass::C1
   101
ruby> ConstClass.new.show
101 102 103
   nil
   

Narozdíl objekt LargestFiles, kde najdete vytvoření nové instnace na konci souboru.

Code: Select all

app = LargestFiles.new
app.run
Domníval jsem se tedy, že dochází k nějaké formě defaultní inicializace v rámci automation scriptu. T.j. objekt není potřeba inicializovat dojde k tomu, pokud použiji automation plugin.

Vycházel jsem z vašeho úplně prvního příkladu, kde k žádné inicializaci nedochází. Nejspíše teď nespustíte ani tento Váš jednoduchý příklad:

Code: Select all

total_size = 0
Salamander.SourcePanel.Items.each { |item| total_size += item.size }
Salamander.MsgBox("Total size of all items in the panel: #{total_size.to_s} bytes", 0, 'File Size in Dir')
manison
Plugin Developer
Plugin Developer
Posts: 216
Joined: 09 Dec 2005, 23:23
Location: Ceske Budejovice, Czech Republic
Contact:

Re: Automation a ruby plugin

Post by manison »

Ten jednoduchý příklad se Salamander.MsgBox mi právě funguje. Domníval jsem se, že by to mohlo být dané "scopem" proměnné. Na globální úrovni to funguje, ale v té třídě LargeFiles asi nikoliv. Jazyk Ruby neznám, ale pochopil jsem, že viditelnost proměnných se řeší pomocí prefixů $, @ apod. Automation přidává objekt Salamander do skriptovacího stroje pomocí metody AddNamedItem. To jsem dopátral až do metody add_named_item a tam jsem skončil. Dokážete vysvětlit, o co tam jde?
User avatar
tukanos
Posts: 410
Joined: 21 Dec 2005, 19:14

Re: Automation a ruby plugin

Post by tukanos »

manison wrote:Ten jednoduchý příklad se Salamander.MsgBox mi právě funguje. Domníval jsem se, že by to mohlo být dané "scopem" proměnné. Na globální úrovni to funguje, ale v té třídě LargeFiles asi nikoliv. Jazyk Ruby neznám, ale pochopil jsem, že viditelnost proměnných se řeší pomocí prefixů $, @ apod. Automation přidává objekt Salamander do skriptovacího stroje pomocí metody AddNamedItem. To jsem dopátral až do metody add_named_item a tam jsem skončil. Dokážete vysvětlit, o co tam jde?
Aha. Tak to je dobře. Máte pravdu, že viditelnost je daná určitými prefixy - tato funkcionalita je určená pro objektové použití ruby a funkcionlitu zvanou mixin - třída do sebe nabalí funkcionalitu definovanou moduly - tudíž ji nemusí definovat v třídě.

Abych byl konkrétní:
$ - definuje globální proměnou (globalní viditelnost)
@ - instační proměná (definované pouze v instanci třídy)
@@ - třídní proměná (existuje ve třídě)

Vytvořil jsem jednoduchý skript, který demostruje přístupnost promněných všechno kromě @@

Code: Select all

module AddToClass
  def honking
    if @honk == 1
      p 'HOOONK'
    else
      p 'silence'
    end
  end
  def set_honk
    @honk = 100
  end
end

module ShowAccessVariable
  module ReallyShow
    attr_accessor :last_test
    #ahoj = 1 # does not work in TestScope
    TEST = 10
    #@kde_jsem = 20 # does not work either
    $mega_test = 400  

    @var_test = 'uzasne'
    def self.print
      p @var_test 
    end
    
    def self.show_last_test
      @last_test = 'bazzinga'
    end
  end
end


class TestScope
  attr_accessor :cink, :honk
  include AddToClass
  include ShowAccessVariable

  def initialize(value)
    @honk = value
    @cink = 1
  end

   @cink = 100 # does nothing => value is still init
   
   def show_variable
     p "Showing test: #{ReallyShow::TEST}" # CONSTANT -> due to the include ShowAccessVariable you don't have to do ShowAccessVariable::ReallyShow::TEST
     #p ReallyShow.ahoj # this produces an error as undefined method 'ahoj' -> ahoj is defined as local variable
     #p "Showing test: #{ReallyShow.kde_jsem}" # Does not show because of the fact that this is an instance variable that belongs to ShowAccessVariable::ReallyShow
     p $mega_test # global variable
     p "Printing the @var_test: #{ReallyShow.print}"
     p "Printing the @last_value: #{ReallyShow.show_last_test}"
   end

end

testing = TestScope.new(1)
p testing.cink
testing.honking
testing.set_honk
p testing.honk
p testing.cink # still prints 1
testing.show_variable
Výstup:

Code: Select all

1
"HOOONK"
100
1
"Showing test: 10"
400
"uzasne"
"Printing the @value: uzasne"
"Printing the @value: bazzinga"

Code: Select all

 def add_named_item(name, obj, global)
      @named_items[name] = NamedItem.new(obj, global)
      if name[0].between?('A', 'Z')
        GlobalProxy.const_set(name, obj)
      else
        define_singleton_method(name.to_sym) { obj }
      end
      if global
        @global = obj
      end
      # ASR 1.0 compatibility
      instance_eval("@#{name} = #{name}")
      GlobalProxy.const_set(name.capitalize, obj)
end
K tomu kódu methody add_named_item
metoda add_named_item příjímá 3 proměnné name, obj, global.
`name` je podle všeho název NamedItem (coz je Struct.new(:obj, :global)) # : znamená symbol
`obj` instance objektu asr (GlobalProxy < AsrProxy) ? (usuzuji z metody create_event_proc a create_event_handler)
`global` asi oveřuje scope dané probměnné či objektu obj (jestli je lokální či globální)

`@named_items` => je inicializován jako prázdná instance třídy Hash.
První řádek dělá to, že zapíše od @named_items záznam (name je klíč, a nová instance NamedItem je hodnotou) {name => instance_NamedItem}.

První if testuje jestli první písmeno je veliké což v Ruby znamená, že daná NamedItem je konstata, v ostatních případech vytvoří jedinečnou metodu
(viz: http://apidock.com/ruby/Object/define_singleton_method)

Druhý if asi vytváří globální objekt (s globální působností?) => pouze moje domněka na základě kódu. A do instanční proměnné @global uloží obj

Ten zbytek je tam z legacy důvodů a dělá vlastně podobné operace ale jednodušeji.
# ASR 1.0 compatibility
instance_eval("@#{name} = #{name}") # ukládá hodnotu lokální proměnné name do instační proměnné @name
GlobalProxy.const_set(name.capitalize, obj) # Vytvaří pro objekt/třídu GlobalProxy konstatní jmeno tím, že vezme jméno a udělá z něho
# velká písmena a pomcí metody const_set vytvoří konstantu pro daný obj

Je to takhle lepší?
manison
Plugin Developer
Plugin Developer
Posts: 216
Joined: 09 Dec 2005, 23:23
Location: Ceske Budejovice, Czech Republic
Contact:

Re: Automation a ruby plugin

Post by manison »

tukanos wrote:Je to takhle lepší?
Musím se přiznat, že ani moc ne :D

Mezitím jsem ale zjistil, že globální objekt WScript "trpí" stejným problémem. Zkuste následující skript ScopeWS.rb

Code: Select all

class TestScope
  def do
    # Objekt WScript neni zde ve tride k dispozici
    WScript.Echo("In Class")
  end
end

WScript.Echo("GLOBAL")

cls = TestScope.new
cls.do
spustit přes wscript ScopeWS.rb.

Jestli se Vám povede upravit tento skript, aby fungoval, pak můžete upravit i Váš původní skript.
User avatar
tukanos
Posts: 410
Joined: 21 Dec 2005, 19:14

Re: Automation a ruby plugin

Post by tukanos »

Rád bych se zeptal na tu změnu v Automation, protože ze Salamandra ty scripty nejdou pustit, nic se nestane.
manison wrote:
tukanos wrote:Je to takhle lepší?
Musím se přiznat, že ani moc ne :D
Já to tušil :D
manison wrote: Mezitím jsem ale zjistil, že globální objekt WScript "trpí" stejným problémem. Zkuste následující skript ScopeWS.rb

Code: Select all

class TestScope
  def do
    # Objekt WScript neni zde ve tride k dispozici
    WScript.Echo("In Class")
  end
end

WScript.Echo("GLOBAL")

cls = TestScope.new
cls.do
spustit přes wscript ScopeWS.rb.

Jestli se Vám povede upravit tento skript, aby fungoval, pak můžete upravit i Váš původní skript.
Chvíli jsem musel přemýšlet a zkoušet a pak mě to docvalklo. Oni se tady setkávají dva světy (windows se scriptováním a objektový). WScript je instance scriptovacího stroje (tedy něco jako WScript = ScriptEngine.new). Jsou tam dvě věci co se musí pořešit - název instance WScript ja v ruby konstanta + jeho existence je pouze ve skriptu a tudíž když chce někdo použít objektové uspořádání musí se založit ten objekt s odkazem na tu instanci, pak to bude fungovat.

Podle mého názoru správné řešení je:

Code: Select all

class TestScope
  attr_reader :wscript_obj
  def initialize(wscript_obj)
    @wscript_obj=wscript_obj
  end
  def do
    # Objekt WScript stále není k dispozici  ALE máme na něj odkaz wscript_obj
     wscript_obj.Echo("In Class") # již v pohodě funguje
  end
end

WScript.Echo("GLOBAL")

cls = TestScope.new(WScript)
cls.do
Teoreticky se to dá i "oprasit" globální proměnnou, ale tento postup nedoporučuji:

Code: Select all

$global_wscript = WScript
class TestScope
  def do
    # Objekt WScript ALE máme místo něho globální proměnnou
     $global_wscript.Echo("In Class") # funguje, ale porušuje objektovou izolaci a hůře se to bude ladit, při složitějším skriptu.
  end
end

WScript.Echo("GLOBAL")

cls = TestScope.new
cls.do
manison
Plugin Developer
Plugin Developer
Posts: 216
Joined: 09 Dec 2005, 23:23
Location: Ceske Budejovice, Czech Republic
Contact:

Re: Automation a ruby plugin

Post by manison »

tukanos wrote:…název instance WScript ja v ruby konstanta + jeho existence je pouze ve skriptu a tudíž když chce někdo použít objektové uspořádání musí se založit ten objekt s odkazem na tu instanci, pak to bude fungovat.
Něco takového jsem tušil, ale se svými (ne)schopnostmi v Ruby jsem to nebyl schopný vyjádřit.
tukanos wrote:Rád bych se zeptal na tu změnu v Automation, protože ze Salamandra ty scripty nejdou pustit, nic se nestane.
Provedl jsem jednu drobnou změnu týkající se inicializace skriptovacího enginu (metoda SetScriptState). Původní logika v Automation byla taková, že v konkrétním případě Ruby enginu vůbec v důsledku nedošlo k jeho spuštění, proto se Vám to jeví, že v Salamanderu nejdou skripty spustit a nic se nestane. Bohužel i tato drobná změna může rozbít jiné enginy (Python, Perl, PHP), kvůli kterým Automation obsahuje spoustu hacků (naproti tomu "Microsoftí" JScript a VBScript jsou v pohodě). Na druhé straně ale tato změna zavádí do inicializace enginu stejnou logiku, jakou používá WScript/CScript, což by mělo kompatibilitu zlepšit pro všechny enginy celkově. Tato úprava bude zahrnuta v příští verzi Salamandera.
Post Reply