[VBScript] VB6 Variant 變數傳遞給 VBScript 的相容檢討

在 VBScript 中,只能只用 Variant 變數,這是大家都知道的。

我維護公司一個舊專案,這是一個 VB6 開發的專案,針對一般硬體來說,已經足夠使用,最近碰上一特殊硬體,設計者不知道是為了增加技術門檻,還是希望使用者連帶軟體一起買,反正通訊部分弄得很鳥,與標準的通訊設計相悖,原先的專案經過簡單調整後,可支援此硬體,當然若碰上其他類似的怪硬體也是可支援。

但是因為原先的架構是每一次傳輸結果都寫入資料庫,因此造成一般硬體大概使用 10 個資料庫欄位,變成使用 30 個資料庫欄位在存垃圾。

這個專案原先就因為考量到不同硬體傳輸回來的結果對應到實體數值需要經過計算,一般情況通常是線性映射,給個比例 (Scale) 跟偏移量 (Offset) 就可以了,但是也是有些怪東西,比如說風速傳回 m/s 要經過一個 2/3 次方的公式才能轉成蒲福風級,或是有些系統參數是另外量測或決定的,所以在這部分使用 Script Control ,透過加密的參數檔可以配合設備任意增加複雜函數或是自動產生簡單函數進行數學計算。

因此我打算利用此功能將通訊封裝起來後,丟到 Script 裡面去跑,當然選用 VBScript ,原始碼可以在 VB6 內測試,會比較單純。

在 VB6 裡面寫測試例時,還特別注意到 VBScript 只能接收 Variant ,因此很確定前後都用 Variant 處理,測試完了後,丟到 VBScript 裡面呼叫,才發現有些細節沒注意到,整理了相關情況如下圖:

(註:此圖省略陣列結構的 Pointer ,正確來說是先 Pointer 到陣列結構,再由陣列結構 Pointer 到實體陣列,有興趣可參閱-鄭子璉,「Microsoft Visual Basic 之 Variant 變數應用」,微軟之友季訊,夏季 6 月號,第 42 ~ 49 頁,民國 90 年 6 月。)

對各種形態變數都有影響,這邊舉 Byte() 陣列為例。

上圖中是三種 Byte() 陣列的宣告。分別可以這樣表示:

1.

Dim arrBytes() As Byte

‘ 這裡是為了比較,所以當然不能用在 VBScript。

2.

Dim arrBytes() As Byte,  vBytes As Variant

vBytes = arrBytes

3.

Dim varBytes() As Variant

varBytes(0) = CByte(1)

其中 1, 2 的 Byte() 陣列在記憶體中連續,在 2 由於 Pointer 變數是由 Variant 構成,所以用 VarType 或 TypeName 都會得到 Byte() 的資訊。由於我需要直接拷貝記憶體,所以我就用了方法 2 …

試了很多次才找出問題,VBScript 只支援方法 3 的 Variant 陣列,也就是整個陣列都由 Variant 陣列構成,

方法 2 一在 VBScript 內使用到索引內容,例如 vBytes(0) 時,就會產生:物件不支援此屬性或方法 (錯誤 438) ,但使用 vBytes 進行操作,直接當引數傳遞或是傳給物件則都沒問題。

另外這種當引數傳遞也不行,會引發另一種錯誤:

Dim arrString() As String

arrString = Split(…)

xxx = VBScriptFunction(arrString)

但若宣告如下則可以當引數傳遞:

Dim arrString As Variant

因此若要寫物件給 VBScript 呼叫,或是要呼叫 VBScript 來處理額外計算,則須注意此點,必須使用完整的 Variant 陣列才可以。

廣告
Categories: 工作點滴, 技術分享 | 1 則迴響

文章分頁導航

One thought on “[VBScript] VB6 Variant 變數傳遞給 VBScript 的相容檢討

  1. 引用通告: [VBScript] 傳遞陣列到 VB6 的物件 « 鄭子璉

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

您的留言將使用 WordPress.com 帳號。 登出 / 變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 / 變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 / 變更 )

Google+ photo

您的留言將使用 Google+ 帳號。 登出 / 變更 )

連結到 %s

在 WordPress.com 建立免費網站或網誌.

%d 位部落客按了讚: