[PRB] 以外のバリエーションの配列を参照するとスクリプト エラーが発生します。

文書番号: 165967 - 対象製品
すべて展開する | すべて折りたたむ

現象

スクリプトしようは、コンポーネントによって返される配列の要素を参照、スクリプト エンジンの報告します。
"オブジェクトは、このプロパティまたはメソッドをサポートしない ' <object>: <method> '"

原因

マイクロソフトから提供されるの VBSCRIPT の作業中のスクリプト エンジンのみ VARIANT の SAFEARRAY にインデックスをサポートします。 VBSCRIPT は境界チェックのため以外のバリアント型の配列を受け入れると、エンジンは、この時点で、配列の内容の操作を許可しない、オブジェクトを他のオートメーションに渡します。

JSCRIPT のアクティブなスクリプト エンジンの境界をテストまたは VARIANT を含む任意の型の SAFEARRAY をインデックス作成のサポートを行いません。 ただし、JSCRIPT は SAFEARRAY を 1 つのオートメーション オブジェクトから別に渡すことです。

解決方法

オートメーション オブジェクトは正常に機能のアプリケーションと VBSCRIPT をホストするコンポーネントするには、VARIANT の SAFEARRAY を作成する必要があります。 バリアント型 (Variant) の要素の SAFEARRAY を VBSCRIPT エンジンに返されるのない Variant データをパッケージ化する必要があります。

VBSCRIPT で記述されたスクリプトは、変数のデータ型をチェックするのに、TypeName 関数を使用する必要があります。 TypeName 関数は、文字列"Variant()、"VARIANT の配列を渡す場合、引用符を除くを返します。

JSCRIPT で記述されたスクリプトを使用して typeof 演算子は、変数のデータ型をテストします。 typeof 演算子は、文字列「不明、」JSCRIPT でサポートされていないデータ型の引用符を除くを返します。

状況

これは仕様によるものです。

詳細

VBSARRAY は、単純な Active Template Library (ATL) バージョン 2. 1 コンポーネントのオブジェクトでこの動作を示します。 コンポーネント デュアル インターフェイスの 3 つの方法をサポートする Ivbsa を実装する: TestBstrs、TestVariants、TestPassArray とします。 最初のでは BSTRs の SAFEARRAY を返すを問題を示します。 2 番目は VARIANT で、BSTRs の各パッケージ化して、ソリューションを示します。 3 番目はことがない-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;
   }
				
JSCRIPT コードは、VBSARRAY.HTM、変数のデータ型をチェックするサンプルを付属テスト ページをここには。
      <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.HTM のページのサンプル、サンプル コンポーネント VBSARRAY.DLL の取得に下指示に従った。
  2. VBSARRAY.DLL REGSVR32.EXE のようなツールを使用してコンポーネントを登録します。
  3. Internet Explorer を起動、および負荷テスト ページを VBSARRAY.HTM します。
  4. [ページで、さまざまなボタンをクリックし、結果の動作を観察指示に従います。
サンプル コンポーネントは、アクティブ テンプレート ライブラリ バージョンを含む Visual C++ 5. 0 では Visual Studio 97 環境を 2. 1 を使用して作成されました。 Visual Studio 97 を持っている場合、VBSARRAY プロジェクトを直接読み込むことができます。 任意のエディターのバリアントと、BSTR の両方で、SAFEARRAY が構築する方法を使用して関連するソース ファイル VBSA.CPP を開くことができますそれ以外の場合は、ケースです。 Cvbsa::TestVariants と Cvbsa::TestBstrs、ソース ファイル内の両方の実装を検索します。

以下のファイルが、Microsoft ダウンロード センターからダウンロードできます。
Vbsarray.exe
マイクロソフトのサポート ファイルをダウンロードする方法の追加についてはをクリックして以下「サポート技術情報」(Microsoft Knowledge Base) 資料を参照。
119591Q119591 How to Obtain Microsoft Support Files from Online Services
マイクロソフトはこのファイルのウイルスをスキャンします。 マイクロソフトでは、アップロード時点の最新のウイルス検査プログラムを使用しています。 ファイルは、ファイルに不正な変更を防止するセキュリティが強化されたサーバーに格納されます。

関連情報

プラットフォーム SDK 『 オートメーション リファレンス 』

Visual Basic 版言語リファレンスのスクリプト

プロパティ

文書番号: 165967 - 最終更新日: 2004年8月5日 - リビジョン: 4.2
この資料は以下の製品について記述したものです。
  • Microsoft Visual Basic Scripting Edition 1.1
  • Visual Basic, Scripting Edition 2.0
  • Visual Basic, Scripting Edition 3.0
  • Microsoft JScript 1.0
  • Microsoft JScript 2.0
  • Microsoft Internet Explorer 4.0 128 ビット版
  • Microsoft Active Server Pages 4.0
キーワード:?
kbdownload kbfile kbprb kbsample kbmt KB165967 KbMtja
機械翻訳の免責
重要: このサポート技術情報 (以下「KB」) は、翻訳者による翻訳の代わりに、マイクロソフト機械翻訳システムによって翻訳されたものです。マイクロソフトは、お客様に、マイクロソフトが提供している全ての KB を日本語でご利用いただけるように、翻訳者による翻訳 KB に加え機械翻訳 KB も提供しています。しかしながら、機械翻訳の品質は翻訳者による翻訳ほど十分ではありません。誤訳や、文法、言葉使い、その他、たとえば日本語を母国語としない方が日本語を話すときに間違えるようなミスを含んでいる可能性があります。マイクロソフトは、機械翻訳の品質、及び KB の内容の誤訳やお客様が KB を利用されたことによって生じた直接または間接的な問題や損害については、いかなる責任も負わないものとします。マイクロソフトは、機械翻訳システムの改善を継続的に行っています。
英語版 KB:165967
Microsoft Knowledge Base の免責: Microsoft Knowledge Baseに含まれている情報は、いかなる保証もない現状ベースで提供されるものです。Microsoft Corporation及びその関連会社は、市場性および特定の目的への適合性を含めて、明示的にも黙示的にも、一切の保証をいたしません。さらに、Microsoft Corporation及びその関連会社は、本文書に含まれている情報の使用及び使用結果につき、正確性、真実性等、いかなる表明・保証も行ないません。Microsoft Corporation、その関連会社及びこれらの権限ある代理人による口頭または書面による一切の情報提供またはアドバイスは、保証を意味するものではなく、かつ上記免責条項の範囲を狭めるものではありません。Microsoft Corporation、その関連会社 及びこれらの者の供給者は、直接的、間接的、偶発的、結果的損害、逸失利益、懲罰的損害、または特別損害を含む全ての損害に対して、状況のいかんを問わず一切責任を負いません。(Microsoft Corporation、その関連会社 またはこれらの者の供給者がかかる損害の発生可能性を了知している場合を含みます。) 結果的損害または偶発的損害に対する責任の免除または制限を認めていない地域においては、上記制限が適用されない場合があります。なお、本文書においては、文書の体裁上の都合により製品名の表記において商標登録表示、その他の商標表示を省略している場合がありますので、予めご了解ください。
サポート期間が終了した「サポート技術情報」資料に関する免責事項
この資料は、マイクロソフトでサポートされていない製品について記述したものです。そのため、この資料は現状ベースで提供されており、今後更新されることはありません。

フィードバック