PRB: 脚本时出现错误引用非变量数组

文章翻译 文章翻译
文章编号: 165967 - 查看本文应用于的产品
本文已归档。它按“原样”提供,并且不再更新。
展开全部 | 关闭全部

症状

当脚本试图引用的一个组件返回的数组元素脚本引擎报告:
"对象不支持此属性或方法 <object><method>"

原因

由 Microsoft 提供的 VBSCRIPT 活动脚本引擎仅支持 SAFEARRAYs 的变体的索引。虽然 VBSCRIPT 能接受非 variant 类型的数组的边界检查,并将它传递给其他自动化对象,该引擎不允许在此时,数组内容的操作。

JSCRIPT 活动脚本引擎不提供用于测试边界或索引 SAFEARRAYs 包括变体的任何类型的支持。但是,JSCRIPT 都能够将 SAFEARRAYs 从一个自动化对象传递到另一个。

解决方案

若要正常的应用程序和组件的宿主 VBSCRIPT 自动化对象应创建 SAFEARRAYs 的变体。 无 VARIANT 数据应返回给 VBSCRIPT 引擎 SAFEARRAY 的 VARIANT 元素中被打包。

VBSCRIPT 中编写的脚本应该用于检查变量的数据类型 TypeName 函数。TypeName 函数返回字符串"Variant(),不包括引号,当传递的变量的数组。

脚本编写的 JSCRIPT 应使用 typeof 运算符来测试变量的数据类型。typeof 运算符返回"未知,不包括的数据类型不支持的 JSCRIPT 引号的字符串。

状态

此行为是设计使然。

更多信息

在 VBSARRAY 是简单的活动模板库 (ATL) 2.1 版组件对象的演示此行为。该组件实现双重接口支持三种方法的 Ivbsa: TestBstrs,TestVariants,和 TestPassArray。第一个示例演示通过返回 SAFEARRAY 的 BSTRs 的问题。第二个演示通过打包在一个 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. 启动 Internet 资源管理器和负载测试页 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 下载中心下载以下文件:
Vbsarray.exe
有关如何下载 Microsoft 支持文件的其他信息请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
119591如何从联机服务获得 Microsoft 支持文件
Microsoft 扫描此文件的病毒。Microsoft 使用该文件已过帐的日期上获得的最新病毒检测软件。该文件存储在安全性得到增强的服务器,这有助于防止未经授权的情况下对其进行更改文件上。

参考

平台 SDK 自动化参考

Microsoft Visual Basic 脚本版语言参考

属性

文章编号: 165967 - 最后修改: 2013年10月6日 - 修订: 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-Bit Edition
  • Microsoft Active Server Pages 4.0
关键字:?
kbnosurvey kbarchive kbmt kbdownload kbfile kbprb kbsample KB165967 KbMtzh
机器翻译
注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。
点击这里察看该文章的英文版: 165967
Microsoft和/或其各供应商对于为任何目的而在本服务器上发布的文件及有关图形所含信息的适用性,不作任何声明。 所有该等文件及有关图形均"依样"提供,而不带任何性质的保证。Microsoft和/或其各供应商特此声明,对所有与该等信息有关的保证和条件不负任何责任,该等保证和条件包括关于适销性、符合特定用途、所有权和非侵权的所有默示保证和条件。在任何情况下,在由于使用或运行本服务器上的信息所引起的或与该等使用或运行有关的诉讼中,Microsoft和/或其各供应商就因丧失使用、数据或利润所导致的任何特别的、间接的、衍生性的损害或任何因使用而丧失所导致的之损害、数据或利润不负任何责任。

提供反馈

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com