Friday, October 19, 2007 - Posts

KB-Can't Create Scripting.Dictionary

Scripting.Dictionary源於Microsoft Scripting Runtime(\Windows\System32\scrrun.dll),是讓我有機會在VB6, VBScript使用Hashtable的救星。

我一直以為Scripting Runtime是所有Windows內建且必備的核心元件,今天才發現並不盡然...

寫了個VBA,在User的機器上一直出現ActiveX Component can't create object.(ActiveX元件無法產生物件)的錯誤訊息,開始我以為是裡面用到的MSXML2.XMLHttp30版本不存在,後來才發現其實錯在建立Scripting.Dictionary時,仔細檢查了一下專案參照,scrrun.dll好好地躺在Windows\System32目錄下,若非是Scripting Host的安裝損壞了嗎??

用regedit搜尋,沒看到Scripting.Dictionary的元件註冊機碼,已有重裝Scripting Host的心理準備。暫且先Goggle了一下,發現有人提到遇到Scripting.Dictionary或FileSystemObject建立失敗時,可以先跑一下regsvr32 scrrun.dll,試試也沒損失... 噹噹~~~ 註冊scrrun.dll後,功能就正常了。

【結論】大家如果遇到Scripting.*家族的物件無法建立時,記得先試試regsvr32 scrrun.dll,如果還不行,就乖乖重裝Scripting Host吧!

參考文章

Self Test - Value Type vs Reference Type

一個小測驗,請用大腦編譯並執行以下的程式,試著回答Q1-Q7的結果為何?

這個測驗可以檢定你是否對.NET的Value Type與Reference Type已有正確認識。

struct MyStruc 
{
    public string Name;
    public string Data;
    public MyStruc(string name, string data)
    {
        Name = name;
        Data = data;
    }
    public override string ToString()
    {
        return Name + ":" + Data;
    }
}
 
class MyClass
{
    public string Name;
    public string Data;
    public MyClass(string name, string data)
    {
        Name = name;
        Data = data;
    }
    public override string ToString()
    {
        return Name + ":" + Data;
    }
}
 
 
static void Func1(MyClass c)
{
    c.Data = "F1";
}
 
static void Func2(MyClass c)
{
    MyClass c2 = new MyClass("Foo", "F2");
    c = c2;
}
 
static void Func3(ref MyClass c)
{
    c.Data = "F3";
}
 
static void Func4(ref MyClass c)
{
    MyClass c2 = new MyClass("Foo", "F4");
    c = c2;
}
 
 
static void Func5(MyStruc s)
{
    s.Data = "F5";
}
 
static void Func6(MyStruc s)
{
    MyStruc s2 = new MyStruc("Bar", "F6");
    s = s2;
}
 
static void Func7(ref MyStruc s)
{
    s.Data = "F7";
}
 
static void VarTest()
{
    MyClass c = new MyClass("Init", "Null");
    Func1(c);
    Console.WriteLine("Q1=" + c.ToString());
    Func2(c);
    Console.WriteLine("Q2=" + c.ToString());
    Func3(ref c);
    Console.WriteLine("Q3=" + c.ToString());
    Func4(ref c);
    Console.WriteLine("Q4=" + c.ToString());
    MyStruc s = new MyStruc("Init", "Null");
    Func5(s);
    Console.WriteLine("Q5=" + s.ToString());
    Func6(s);
    Console.WriteLine("Q6=" + s.ToString());
    Func7(ref s);
    Console.WriteLine("Q7=" + s.ToString());
    Console.Read();
}

比較容易搞混的地方Func1及Func3,Class是Reference Type,所以不管是以By Value或By Reference的方式將物件變數傳入函數中,函數中存取及變更的都是你傳入的物件本尊,而不是另外複製的複本。但Func2, Func4倒是可以看出By Reference造成傳入函數的變數c有複本及本尊的差別。Structure在.NET中是Value Type,當成參數傳入時,除非用ref宣告By Reference,否則傳入的都是分身。

正確答案:
Q1=Init:F1
Q2=Init:F1
Q3=Init:F3
Q4=Foo:F4
Q5=Init:Null
Q6=Init:Null
Q7=Init:F7

PS:  昨天在寫程式時,遇到了Q2的Scenario,忽然迷惑了一下,就寫了一小段Code來確認,索性稍加修改變成一個小測驗讓大家玩一玩。

Search

Go

<October 2007>
SunMonTueWedThuFriSat
30123456
78910111213
14151617181920
21222324252627
28293031123
45678910
 
RSS
【工商服務】


BlogLook Score and Rank

Syndication