Jak předat SafeArray řetězců v VARIANT * mezi Visual C++ a Visual Basic 6.0

Překlady článku Překlady článku
ID článku: 167668 - Produkty, které se vztahují k tomuto článku.
Poznámka: Microsoft Visual C++ .NET (2002) podporuje model spravovaný kód, který je součástí Microsoft .NET Framework a Nespravovaná nativní kód modelu Microsoft Windows. Informace v tomto článku platí pouze pro nespravované kód jazyka C++.
Rozbalit všechny záložky | Minimalizovat všechny záložky

Souhrn

Prohlédněte informace o předávání SafeArrays mezi Visual C++ a Visual Basic 6.0 většinu předat SafeArray parametr zadejte VARIANT. V MFC to přeloží parametr "Const VARIANT & Název_proměnné".

Jako alternativu prozkoumá Tento článek jak předat VARIANT *, které bude deklarován jako parametr "FAR VARIANT * Název_proměnné" v MFC.

Proč by měl používáte jednu metodu přes druhý? Protože většina aplikací povolit úpravy SafeArray předaný VARIANT, ale ne všechny. V aplikaci Excel 95 můžete předat SafeArray v VARIANT Visual C++ server, měnit hodnoty v serveru, vraťte upravené SafeArray a neexistuje žádná změna v aplikaci Excel 95. Z jiného důvodu použít tento postup je možné obejít omezení v Visual Basic 6.0 při použití brzy vazby.

Další informace

Ukazují tento koncept začínat nový projekt "MFC AppWizard(exe)" nazývá StrArray. "Kroku 3 z 6," Vyberte Automatizace, klepněte na tlačítko Dokončit a potom klepněte na tlačítko OK generovat soubory projektu.

Poznámka: Pokud pomocí Visual Studio.NET: vytvořit novou "MFC aplikaci" projektu nazývá StrArray. Na kartě Upřesnit funkceAutomatizace vyberte a klepněte na tlačítko Dokončit generovat soubory projektu.

Nyní vytvořit jediné automatizace metodu pomocí ClassWizard. V ClassWizard, vyberte v části "CStrArrayDoc" "název třídy:". Klepněte na kartu Automatizace a klepněte na tlačítko Přidat metodu. Do dialogového okna Přidat metodu, zadejte následující hodnoty:

Poznámka: Pokud pomocí Visual Studio.NET: Přidat metodu jediné automatizace pomocí "Třída zobrazit". Rozbalte strom zobrazení tříd a vyhledat VCCOdeIDLLibrary položka. Najděte rozhraní IStrArray pod tento uzel. Klepněte pravým tlačítkem myši na rozhraní a potom vyberte Přidat metodu. Zadejte následující hodnoty do dialogového okna Přidat metodu:
   External Name : Sort
   Internal Name : Sort
   Return Type   : long
   Parameter List:

      Name       : vArray
      Type       : VARIANT*
				


Klepněte na tlačítko OK a Upravit kód.

Implementovat metodu řazení, použijte metodu FastSort ukázkové MFCARRAY uvedené v části odkazy. To umožňuje zobrazit rozdíly mezi předáním parametr jako "const VARIANT & Název_proměnné" a "VARIANT * Název_proměnné". Metoda řazení změnit následujícím způsobem:

   ...
   #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;

   }
				


Nyní můžete vytvořit a vyzkoušet automatizační server. Po sestavení serveru spustit jako samostatný jej zaregistrovat. Spustit Visual Basic 6.0 a vytvoření nového projektu Visual Basic 6.0. Umístit tlačítka na formulář a upravte popisovač odpovídají kód níže:

   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
				


Klíč k získání této syntaxe pracovat Visual Basic 6.0 je první matice proměnné jako variant Dim a aby stal variant obsahující pole řetězců jej ReDim. Nyní jste připraveni otestovat serveru. Nastavit konec body v kódu Visual Basic 6.0 před a po volání seřadit. Spuštění aplikace Visual Basic 6.0 klepněte na Command1 a zkontrolujte hodnoty v použít okno kukátka.

Odkazy

Další informace naleznete v následujících článcích znalostní báze Microsoft Knowledge Base:
122287Limity jazyka 3.0 & Disptest jako řadiče automatizace
131046Převede binární data pomocí automatizace OLE Binary.exe
131086Použití nouzového matice automatizace
140202Pomocí nouzového matice MFC automatizace MFCArray
122289Předávání struktur automatizace OLE
154172Jak předat binárních dat mezi ovládací prvek a VB
Microsoft Systems deník, červnu 1996 "Dotazů a odpovědí k OLE" podle pole Jan.

(c) 1997 Microsoft Corporation, všechny rezervované práv. Příspěvky Shawn W. Karr, Microsoft Corporation.

Vlastnosti

ID článku: 167668 - Poslední aktualizace: 21. listopadu 2006 - Revize: 3.1
Informace v tomto článku jsou určeny pro produkt:
  • Microsoft Foundation Class Library 4.2 na těchto platformách
    • 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
Klíčová slova: 
kbmt kbautomation kbfaq kbhowto KB167668 KbMtcs
Strojově přeložený článek
Důležité: Tento článek byl přeložen pomocí software společnosti Microsoft na strojový překlad, ne profesionálním překladatelem. Společnost Microsoft nabízí jak články přeložené překladatelem, tak články přeložené pomocí software na strojový překlad, takže všechny články ve Znalostní databázi (Knowledge Base) jsou dostupné v češtině. Překlad pomocí software na strojový překlad ale není bohužel vždy dokonalý. Obsahuje chyby ve skloňování slov, skladbě vět, nebo gramatice, podobně jako když cizinci dělají chyby při mluvení v češtině. Společnost Microsoft není právně zodpovědná za nepřesnosti, chyby nebo škody vzniklé chybami v překladu, nebo při použití nepřesně přeložených instrukcí v článku zákazníkem. Společnost Microsoft aktualizuje software na strojový překlad, aby byl počet chyb omezen na minimum.
Projděte si také anglickou verzi článku:167668

Dejte nám zpětnou vazbu

 

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