Wie ein SafeArray von Zeichenfolgen in einem VARIANT 1 zwischen Visual C++ und Visual Basic 6.0 zu übergeben.

SPRACHE AUSWÄHLEN SPRACHE AUSWÄHLEN
Artikel-ID: 167668 - Produkte anzeigen, auf die sich dieser Artikel bezieht
Hinweis: Microsoft Visual C++ .NET (2002) unterstützt sowohl das verwaltete Codemodell aus dem Microsoft .NET Framework als auch das nicht verwaltete Codemodell, das in Microsoft Windows integriert ist. Die Informationen in diesem Artikel beziehen sich nur auf nicht verwalteten Visual C++-Code.
Alles erweitern | Alles schließen

Zusammenfassung

Geben VARIANT, wenn Sie die Informationen auf übergeben betrachten SafeArrays zwischen Visual C++ und Visual Basic 6.0, die meisten der SafeArray in einen Parameter übergeben. In MFC übersetzt diese in einen "const VARIANT & VarName"-Parameter.

Als Alternative wird untersucht, in diesem Artikel wie eine VARIANT 1, übergeben, die in MFC als "VARIANT FAR 1 VarName" Parameter deklariert werden.

Warum sollten Sie eine Methode gegenüber der anderen verwenden? Da die meisten Anwendungen ein SafeArray in ein VARIANT, aber nicht alle übergebenen Änderungen ermöglichen. In Excel 95 können Sie ein SafeArray in ein VARIANT an übergeben eines Visual C++-Server, ändern die Werte auf dem Server, geänderte SafeArray zurückgegeben und es ist keine Änderung in Excel 95. Ein weiterer Grund verwenden Sie dieses Verfahren ist eine Einschränkung in Visual Basic 6.0 zu umgehen, wenn Sie die frühe Bindung verwenden.

Weitere Informationen

Dieses Konzept veranschaulichen, beginnen Sie mit ein neues "MFC AppWizard(exe)" Projekt StrArray aufgerufen. Aktivieren Sie in "Schritt 3 von 6" Automatisierung , klicken Sie auf Fertig stellen und klicken Sie auf OK , um die Projektdateien generieren.

Hinweis : Wenn Visual Studio verwenden: Erstellen einer neuen "MFC-Anwendung" Projekt StrArray aufgerufen. Aktivieren Sie auf der Registerkarte Erweiterte Features Automatisierung und klicken Sie auf Fertig stellen , um die Projektdateien generieren.

Nun erstellen Sie eine einzelne Automatisierungsmethode Klassenassistenten verwenden. Im Klassen-Assistenten, wählen Sie "CStrArrayDoc" unter "Klassenname:". Klicken Sie auf die Registerkarte Automatisierung und klicken Sie auf Hinzufügen . Geben Sie im Dialogfeld hinzufügen die folgenden Werte:

Hinweis : Wenn Visual Studio verwenden: Hinzufügen eines einzelnen Automatisierungsmethode "Klassenansicht". Erweitern Sie die Klassenansicht Struktur, und suchen Sie nach der VCCOdeIDLLibrary-Eintrag. Gefunden Sie die IStrArray-Schnittstelle unter diesem Knoten. Klicken Sie mit der rechten Maustaste auf die Schnittstelle, und wählen Sie die Hinzufügen . Geben Sie im Dialogfeld hinzufügen die folgenden Werte:
   External Name : Sort
   Internal Name : Sort
   Return Type   : long
   Parameter List:

      Name       : vArray
      Type       : VARIANT*
				


Klicken Sie auf OK , und Bearbeiten von Code .

Implementieren die Sort-Methode verwenden Sie die FastSort-Methode des MFCARRAY Beispiels INFORMATIONSQUELLEN im Abschnitt weiter unten. Dadurch können Sie die Unterschiede zwischen übergeben des Parameters als einen "const VARIANT & VarName" erkennen und "VARIANT 1 VarName". Ändern Sie die Sort-Methode wie folgt:

   ...
   #include <afxpriv.h>
   ...
   long CStrArrayDoc::Sort(VARIANT FAR* vArray)
   {

      long i, j, min;
      BSTR bstrTemp;
      SAFEARRAY FAR* psa = NULL;
      BSTR HUGEP *pbstr;
      HRESULT hr;
      DWORD dwTimeStart;
      LONG cElements, lLBound, lUBound;

      USES_CONVERSION;

      // Type check VARIANT parameter. It should contain a BSTR array
      // passed by reference. The array must be passed by reference it is
      // an in-out-parameter.
      if (V_VT(vArray) != (VT_ARRAY | VT_BSTR))
         AfxThrowOleDispatchException(1001,
           "Type Mismatch in Parameter. Pass a string array by reference");
      psa = V_ARRAY(vArray);
      // Check dimensions of the array.
      if (SafeArrayGetDim(psa) != 1)
         AfxThrowOleDispatchException(1002,
           "Type Mismatch in Parameter. Pass a one-dimensional array");

      dwTimeStart = GetTickCount();

      // Get array bounds.
      hr = SafeArrayGetLBound(psa, 1, &lLBound);
      if (FAILED(hr))
          goto error;
      hr = SafeArrayGetUBound(psa, 1, &lUBound);
      if (FAILED(hr))
          goto error;

      // Get a pointer to the elements of the array.
      hr = SafeArrayAccessData(psa, (void HUGEP* FAR*)&pbstr);
      if (FAILED(hr))
         goto error;

      // Bubble sort.
      cElements = lUBound-lLBound+1;
      for (i = 0; i < cElements-1; i++)
      {
         min = i;
         for (j = i+1; j < cElements; j++)
         {
            // NULL is a valid value for a BSTR. This code treats a NULL
            // BSTR as less than other string values.
            if (pbstr[min] == NULL)
               continue;
            else if (pbstr[j] == NULL
               || wcscmp(pbstr[j], pbstr[min]) < 0)
               min = j;
         }

         //Swap array[min] and array[i].
         bstrTemp = pbstr[min];
         pbstr[min] = pbstr[i];
         pbstr[i] = bstrTemp;
      }

      hr = SafeArrayUnaccessData(psa);
      if (FAILED(hr))
         goto error;

      return GetTickCount()-dwTimeStart;

   error:

      AfxThrowOleDispatchException(1003,
        "Unexpected Failure in FastSort method");
      return 0;

   }
				


Sie können jetzt erstellen und den Automatisierungsserver testen. Nach dem Erstellen des Servers führen Sie es als ein eigenständiges registrieren. Führen Sie Visual Basic 6.0 und erstellen Sie ein neues Visual Basic 6.0-Projekt. Setzen Sie eine Schaltfläche auf das Formular, und ändern Sie der Handler entsprechend den folgenden Code:

   Private Sub Command1_Click()
      Dim o As Object
      Dim v As Variant
      ReDim v(50) As String
      Dim SortTime As Long

      Set o = CreateObject("StrArray.Document")

      upperbound = 1
      lowerbound = 100
      For n = 0 To 50
          v(n) = "Entry " & Int((upperbound-lowerbound+1)*Rnd+lowerbound)
      Next n

      SortTime = o.Sort(v)
      MsgBox ("Done")
   End Sub
				


Der Schlüssel zum Abrufen dieser Syntax in Visual Basic 6.0 arbeiten, erste Dim die Arrayvariable als Variante ist, und dann ReDim, so dass es eine Variante enthält ein Array von Zeichenfolgen wird. Jetzt können Sie den Server zu testen. Legen Sie Haltepunkte in Visual Basic 6.0-Code, vor und nach dem Aufruf von sortieren. Führen Sie die Visual Basic 6.0-Anwendung, klicken Sie auf Command1, und verwenden Sie das Überwachungsfenster um die Werte für v zu überprüfen.

Informationsquellen

Weitere Informationen finden Sie in den folgenden Artikeln der Microsoft Knowledge Base:
122287Grenzen des Visual Basic 3.0 & Disptest als Automatisierungscontroller
131046Binary.exe überträgt Binärdaten mithilfe von OLE-Automatisierung
131086Verwendung von sicheren Arrays bei der Automatisierung
140202Verwenden sichere Arrays in MFC Automatisierung MFCArray
122289Übergeben von Strukturen in OLE-Automatisierung
154172Wie binäre Daten zwischen einem Steuerelement und VB übergeben
Microsoft Systems Journal , Juni 1996 "Fragen OLE" von Don Box.

(c) 1997 Microsoft Corporation, alle Rechte vorbehalten. Beiträge von Shawn Arbeit Karr, Microsoft Corporation.

Eigenschaften

Artikel-ID: 167668 - Geändert am: Dienstag, 21. November 2006 - Version: 3.1
Die Informationen in diesem Artikel beziehen sich auf:
  • Microsoft Foundation Class Library 4.2, wenn verwendet mit:
    • Microsoft Visual C++ 2.0 Professional Edition
    • Microsoft Visual C++ 2.1
    • Microsoft Visual C++ 2.2
    • Microsoft Visual C++ 4.0 Standard Edition
    • Microsoft Visual C++ 4.0 Standard Edition
    • Microsoft Visual C++ 4.1 Subscription
    • Microsoft Visual C++ 4.2 Professional Edition
    • Microsoft Visual C++ 4.2 Enterprise Edition
    • Microsoft Visual C++ 5.0 Enterprise Edition
    • Microsoft Visual C++ 6.0 Enterprise Edition
    • Microsoft Visual C++ 4.2 Professional Edition
    • Microsoft Visual C++ 5.0 Professional Edition
    • Microsoft Visual C++ 6.0 Professional Edition
    • Microsoft Visual C++, 32-bit Learning Edition 6.0
    • Microsoft Visual C++ .NET 2002 Standard Edition
  • Microsoft Visual C++ .NET 2003 Standard Edition
Keywords: 
kbmt kbautomation kbfaq kbhowto KB167668 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: 167668
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