PRB: 指令碼時,就會發生錯誤參考非 Variant 陣列

重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。

165967
本文已封存。本文係以「現狀」提供且不會再更新。
徵狀
當指令碼嘗試參考一個元件所傳回的陣列的項目指令碼引擎會報告:
「 物件不支援此屬性或方法 ' <object><method>'"
發生的原因
VBSCRIPT 作用中指令碼引擎由 Microsoft 提供僅支援的變種 SAFEARRAYs 編製索引。當 VBSCRIPT 能夠的非 Variant 型別的陣列的界限檢查目的,且將它傳遞至其他自動化物件,引擎不允許操作陣列內容的這一次。

JSCRIPT 作用中的指令碼引擎不會提供測試界限,或任何型別包括變種 SAFEARRAYs 編製索引的支援。不過,JSCRIPT 都可以將 SAFEARRAYs 從一個自動化物件傳遞至另一個。
解決方案
若要正常與應用程式和元件裝載 VBSCRIPT,Automation 物件應該建立 SAFEARRAYs 的變種。 未 VARIANT 資料應該封裝的傳回至 VBSCRIPT 引擎 SAFEARRAY VARIANT 元素中。

VBSCRIPT 所撰寫的指令碼應該使用 TypeName 函式來檢查變數的資料型別。TypeName 函式會傳回字串"Variant(),"不包括引號時傳遞的變數陣列。

JSCRIPT 所撰寫的指令碼應該使用 typeof 運算子來測試一變數的資料型別。typeof 運算子會傳回字串"未知,」 排除的資料型別不支援由 JSCRIPT 引號。
狀況說明
這種行為是經過設計規劃的。
其他相關資訊
[VBSARRAY 是簡單的動態樣板程式庫 (ATL) 會示範這個行為的 2.1 版元件物件。元件會實作雙重介面 Ivbsa 支援三種方法: TestBstrs TestVariants,和 TestPassArray。第一個會藉由傳回一個 BSTRs SAFEARRAY 示範問題。第二個示範藉由封裝在一個 VARIANT BSTRs 的每個方案。第三個示範非 VARIANT 型別的陣列可以傳遞從元件至 VBSCRIPT 或 JSCRIPT 至元件。資料都會保持不變。

以下是 TestVariants 實作:
      // Return a VARIANT array of VARIANTs which hold BSTRs      STDMETHODIMP Cvbsa::TestVariants(VARIANT * pvaVariant)      {         HRESULT hr = NOERROR;         LPSAFEARRAY psa;         SAFEARRAYBOUND rgsabound[]  = { 3, 0 }; // 3 elements, 0-based         int i;         if (!pvaVariant)         {            return E_INVALIDARG;         }         VariantInit(pvaVariant);         psa = SafeArrayCreate(VT_VARIANT, 1, rgsabound);         if (!psa)         {            return E_OUTOFMEMORY;         }         VARIANT vFlavors[3];         for (i = 0; i < 3; i++)         {            VariantInit(&vFlavors[i]);            V_VT(&vFlavors[i]) = VT_BSTR;         }         V_BSTR(&vFlavors[0]) = SysAllocString(OLESTR("Vanilla"));         V_BSTR(&vFlavors[1]) = SysAllocString(OLESTR("Chocolate"));         V_BSTR(&vFlavors[2]) = SysAllocString(OLESTR("Espresso Chip"));         if (!V_BSTR(&vFlavors[0]) || !V_BSTR(&vFlavors[1]) ||             !V_BSTR(&vFlavors[2]))         {            hr = E_OUTOFMEMORY;            goto Error;         }         {                //Plug references to the data into the SAFEARRAY               LPVARIANT rgElems;               if (FAILED(hr = SafeArrayAccessData(psa,(LPVOID*)&rgElems)))            {               goto Error;            }            for (i = 0; i < 3; i++)            {               rgElems[i] = vFlavors[i];            }            SafeArrayUnaccessData(psa);         }         V_VT(pvaVariant) = VT_ARRAY | VT_VARIANT;         V_ARRAY(pvaVariant) = psa;         return NOERROR;   Error:         for (i = 0; i < 3; i++)         {            if (V_BSTR(&vFlavors[i])            {               VariantClear(&vFlavors[i]);            }         }         return hr;   }				
這裡就是從 VBSARRAY.HTM 隨附範例,請在檢查變數的資料類型的測試頁 JSCRIPT 碼:
      <SCRIPT LANGUAGE=JSCRIPT>      function JScriptSafeArrayTest()      {         pvaBstr = SimpleComponent.TestBstrs()         if (typeof(pvaBstr) == "unknown")         {            Alert("JSCRIPT cannot handle the type returned by TestBstrs()")            SimpleComponent.TestPassedArray(pvaBstr)         }         pvaVariant = SimpleComponent.TestVariants()         if (typeof(pvaVariant) == "unknown")         {         Alert("JSCRIPT cannot handle the type returned by TestVariants()")            SimpleComponent.TestPassedArray(pvaVariant)         }      }      </SCRIPT>				
若要示範問題和解決方案,執行下列步驟:

  1. 上取得範例元件 VBSARRAY.DLL 依照以下指示,並範例頁面 VBSARRAY.HTM。
  2. 註冊元件 VBSARRAY.DLL 使用 REGSVR32.EXE 等工具。
  3. 啟動網際網路檔案總管] 及 [負載測試頁 VBSARRAY.HTM。
  4. 依頁面按一下不同的按鈕,並觀察產生的行為顯示的指示。
範例元件已建立使用動態樣板程式庫版本 2.1 包括與 Visual C++ 5.0 中 Visual Studio 97 的環境。如果您 Visual Studio 97 您可以直接載入 VBSARRAY 專案。否則,您可以在 [SAFEARRAY [VARIANT 和 [BSTR 二者的建構方式,請參閱任何編輯器中開啟相關的原始程式檔 VBSA.CPP 情況。搜尋 Cvbsa::TestVariants 和 Cvbsa::TestBstrs 原始程式檔中的實作。

從 「 Microsoft 下載中心 」 下載下列檔案有:
如需有關如何下載 Microsoft 支援檔案的詳細資訊,按一下 [下列面的文件編號,檢視 「 Microsoft 知識庫 」 中的發行項]:
119591如何從線上服務取得 Microsoft 支援檔案
Microsoft 已掃描這個檔案有無病毒。Microsoft 使用已張貼檔案的日期中的 [可用的最新病毒偵測軟體。檔案儲存在安全性強化的伺服器上,以避免任何未經授權的更改至檔案。
参考
平台 SDK 自動化參考

Microsoft Visual Basic 指令碼版語言參考

警告:本文已自動翻譯

內容

文章識別碼:165967 - 最後檢閱時間:10/06/2013 23:24:42 - 修訂: 4.2

  • Microsoft Visual Basic Scripting 版 1.1
  • Visual Basic Scripting 版 2.0
  • Visual Basic Scripting 版 3.0
  • Microsoft JScript 1.0
  • Microsoft JScript 2.0
  • Microsoft Internet Explorer 4.0 128-Bit Edition
  • Microsoft Active Server Pages 4.0
  • kbnosurvey kbarchive kbmt kbdownload kbfile kbprb kbsample KB165967 KbMtzh
意見反應