PRB: Skript Fehler beim Verweisen auf nicht-Variant-Array

SPRACHE AUSWÄHLEN SPRACHE AUSWÄHLEN
Artikel-ID: 165967 - Produkte anzeigen, auf die sich dieser Artikel bezieht
Dieser Artikel wurde archiviert. Er wird im vorliegenden Zustand bereitgestellt und nicht mehr aktualisiert.
Alles erweitern | Alles schließen

Problembeschreibung

Wenn ein Skript versucht, verweisen die Elemente eines Arrays von einer Komponente zurückgegebenen das Skriptmodul Berichte:
<object><method>"Objekt unterstützt diese-Eigenschaft oder Methode ' <objekt>. <methode>" "

Ursache

Die VBSCRIPT active scripting-Engine von Microsoft bereitgestellten unterstützt nur die Indizierung von SAFEARRAYs von Variant. Während VBSCRIPT zur Annahme von Arrays von nicht-Variant-Typ für die Zwecke Grenze überprüft fähig ist, und Übergabe an andere Automatisierung Objekte, die Engine Manipulation der Array-Inhalt zu diesem Zeitpunkt nicht zulässt.

Die JSCRIPT active scripting-Engine bietet keine Unterstützung für Tests der Begrenzungen oder SAFEARRAYs eines beliebigen Typs einschließlich Variant Indizierung. Allerdings kann JSCRIPT SAFEARRAYs aus einem Automatisierungsobjekt auf einen anderen übergeben.

Lösung

Mit Anwendungen und Komponenten ordnungsgemäß sollten die Host VBSCRIPT, SAFEARRAYs des Variant Automatisierungsobjekte erstellen. Nicht-VARIANT-Daten sollten in den VARIANT-Elementen des SAFEARRAY an das VBSCRIPT-Modul zurückgegeben werden gepackt.

In VBSCRIPT geschriebene Skripts sollten die TypeName-Funktion verwenden, um überprüfen Sie den Datentyp einer Variablen. Die TypeName-Funktion gibt die Zeichenfolge "Variant()", ohne die Anführungszeichen wenn ein Array von Variant übergeben.

In JSCRIPT geschriebene Skripts sollten den Typeof-Operator verwenden, um den Datentyp einer Variablen überprüfen. Der Typeof-Operator gibt die Zeichenfolge "unbekannt", ohne die Anführungszeichen für Datentypen von JSCRIPT nicht unterstützt.

Status

Es handelt sich hierbei um ein beabsichtigtes Verhalten.

Weitere Informationen

Die VBSARRAY ist eine einfache ATL (Active Template Library) Version 2.1 Komponentenobjekt, das dieses Verhalten veranschaulicht. Die Komponente implementiert eine duale Schnittstelle Ivbsa, die drei Methoden unterstützt: TestBstrs, TestVariants und TestPassArray. Im ersten Beispiel das Problem wird veranschaulicht, indem ein SAFEARRAY von BSTRs zurückgeben. Die zweite veranschaulicht die Lösung, indem Sie Verpacken aller BSTRs in ein VARIANT. Die dritte veranschaulicht, dass ein Array von nicht-VARIANT-Typ von Komponente VBSCRIPT oder JSCRIPT Komponente übergeben werden kann. Die Daten bleiben erhalten.

Hier ist die Implementierung der 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;
   }
				
hier ist der JSCRIPT-Code von VBSARRAY.HTM, die Testseite im Beispiel den Datentyp einer Variablen überprüft enthalten:
      <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>
				
Um das Problem und die Projektmappe zu demonstrieren, führen Sie die folgenden Schritte aus:

  1. Befolgen Sie die nachstehenden Anweisungen zum Abrufen der Beispielkomponente VBSARRAY.DLL und Seite VBSARRAY.HTM-Beispiel.
  2. Registrieren Sie die VBSARRAY.DLL mit einem Tool wie z. B. regsvr32.exe-Komponente.
  3. Starten Internet Explorer, und Laden der Test Seite VBSARRAY.HTM.
  4. Folgen Sie den Anweisungen auf der Seite auf die verschiedenen Schaltflächen und das resultierende Verhalten beobachten.
Die Beispielkomponente wurde mit einschließlich mit Visual C++ 5.0 in der Visual Studio 97 Umgebung ATL 2.1 erstellt. Wenn Sie Visual Studio 97 verfügen, können Sie das Projekt VBSARRAY direkt laden. Sie können, andernfalls die entsprechenden Quelldatei VBSA.CPP in jeder-Editor finden Sie unter Aufbau der SAFEARRAY in den VARIANT und den BSTR öffnen Fällen. Suchen Sie nach der Implementierung von Cvbsa::TestVariants und Cvbsa::TestBstrs in der Quelldatei.

Die folgenden Dateien stehen im Microsoft Download Center zum Download zur Verfügung:
Vbsarray.exe
Weitere Informationen zum Download von Microsoft Support-Dateien finden Sie in folgendem Artikel der Microsoft Knowledge Base:
119591So erhalten Sie Dateien vom Microsoft Support im Internet
Microsoft hat diese Datei auf Viren überprüft. Microsoft hat dazu die neueste Software zur Virenerkennung verwendet, die zum Zeitpunkt der Bereitstellung verfügbar war. Die Datei befindet sich auf Servern mit verstärkter Sicherheit, wodurch nicht autorisierte Änderungen an der Datei weitestgehend verhindert werden.

Informationsquellen

Plattform SDK-Automatisierungsreferenz

Microsoft Visual Basic Scripting Edition Sprachreferenz

Eigenschaften

Artikel-ID: 165967 - Geändert am: Sonntag, 9. Februar 2014 - Version: 4.2
Die Informationen in diesem Artikel beziehen sich auf:
  • 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
Keywords: 
kbnosurvey kbarchive kbmt kbdownload kbfile kbprb kbsample KB165967 KbMtde
Maschinell übersetzter Artikel
Wichtig: Dieser Artikel wurde maschinell und nicht von einem Menschen übersetzt. Die Microsoft Knowledge Base ist sehr umfangreich und ihre Inhalte werden ständig ergänzt beziehungsweise überarbeitet. Um Ihnen dennoch alle Inhalte auf Deutsch anbieten zu können, werden viele Artikel nicht von Menschen, sondern von Übersetzungsprogrammen übersetzt, die kontinuierlich optimiert werden. Doch noch sind maschinell übersetzte Texte in der Regel nicht perfekt, insbesondere hinsichtlich Grammatik und des Einsatzes von Fremdwörtern sowie Fachbegriffen. Microsoft übernimmt keine Gewähr für die sprachliche Qualität oder die technische Richtigkeit der Übersetzungen und ist nicht für Probleme haftbar, die direkt oder indirekt durch Übersetzungsfehler oder die Verwendung der übersetzten Inhalte durch Kunden entstehen könnten.
Den englischen Originalartikel können Sie über folgenden Link abrufen: 165967
Microsoft stellt Ihnen die in der Knowledge Base angebotenen Artikel und Informationen als Service-Leistung zur Verfügung. Microsoft übernimmt keinerlei Gewährleistung dafür, dass die angebotenen Artikel und Informationen auch in Ihrer Einsatzumgebung die erwünschten Ergebnisse erzielen. Die Entscheidung darüber, ob und in welcher Form Sie die angebotenen Artikel und Informationen nutzen, liegt daher allein bei Ihnen. Mit Ausnahme der gesetzlichen Haftung für Vorsatz ist jede Haftung von Microsoft im Zusammenhang mit Ihrer Nutzung dieser Artikel oder Informationen ausgeschlossen.

Ihr Feedback an uns

 

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