Ako prejsť SafeArray struny v VARIANT * medzi Visual C++ a Visual Basic 6.0

Preklady článku Preklady článku
ID článku: 167668 - Zobraziť produkty, ktorých sa tento článok týka.
Poznámka: Microsoft Visual C++.NET (2002) podporuje spravovaný kód model, ktorý je poskytované spoločnosťou Microsoft.NET Framework a nespravovaná rodák Microsoft Windows kód modelu. Informácie v tomto článku sa vzťahuje iba na nespravovaná Visual c ++ kód.
Rozbaliť všetko | Zbaliť všetko

SUHRN

Keď sa pozriete na dostupné informácie o absolvovanie SafeArrays medzi Visual C++ a Visual Basic 6.0, väčšina prejsť SafeArray v parameter typ VARIANT. V MFC, to sa premieta do "const VARIANT & varName"parameter.

Ako alternatíva, tento článok skúma ako prejsť VARIANT *, ktorý v MFC bude vyhlásený ako "VARIANT FAR * varName" parameter.

Prečo by ste mali používať jednu metódu nad sebou? Pretože väčšina aplikácií povoliť úpravy SafeArray zložil v VARIANT, ale nie všetky. V programe Excel 95, môžete prejsť SafeArray za VARIANT s Visual c ++ Server, meniť hodnoty v serveri, vrátiť modifikované SafeArray, a neexistuje žiadna zmena v programe Excel 95. Ďalší dôvod pre použitie tejto techniky je pracovať okolo obmedzenie v Visual Basic 6.0, pri použití včasnú väzbu.

DALSIE INFORMACIE

Na preukázanie tejto koncepcie, začať s novým "MFC AppWizard(exe) "projekt nazvaný StrArray. V "Krok 6 3," vyberte Automatizácia, kliknite na tlačidlo Dokončiť, a potom kliknite na tlačidlo ok vytvárať súbory projektu.

POZNÁMKA: Ak pomocou Visual Studio.NET: vytvoriť nové "MFC aplikácia" projekt nazvaný StrArray. Na Rozšírené funkcie Záložka, vyberte Automatizácia, a potom kliknite na tlačidlo Dokončiť vytvárať súbory projektu.

Teraz vytvoriť jednotnú spôsob automatizácie pomocou ClassWizard. V ClassWizard, vyberte "CStrArrayDoc" pod "názov triedy:". Kliknite na Automatizácia kartu a kliknite na tlačidlo Pridať metóda. Do dialógového okna Pridať metódu zadajte nasledujúce hodnoty:

POZNÁMKA: Ak pomocou Visual Studio.NET: pridať jediného automatizácie metóda pomocou "Trieda View". Rozbaľte strom triedy zobrazení a pozrite sa na VCCOdeIDLLibrary položka. Nájsť IStrArray rozhranie tomto uzle. Kliknite pravým tlačidlom na rozhranie, a potom vyberte Pridať metóda. Do dialógového okna Pridať metódu zadajte nasledujúce hodnoty:
   External Name : Sort
   Internal Name : Sort
   Return Type   : long
   Parameter List:

      Name       : vArray
      Type       : VARIANT*
				


Kliknite na položku ok a Úprava kódu.

Implementovať metódu zoraďovania, použite metódu FastSort MFCARRAY vzorky uvedenej v časti odkazy nižšie. To umožňuje môžete vidieť rozdiely medzi absolvovanie parametra ako "konšt VARIANT & varName"a"VARIANT * varName". Upraviť metódu zoraďovania ako takto:

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

   }
				


Teraz môžete vytvoriť a testovať automatizačného servera. Po vás vybudovať server, spustite ho ako samostatného sa ho zaregistrovať. Spustiť Visual Basic 6.0 a vytvorenie nového projektu Visual Basic 6.0. Umiestnite tlačidlu na formulári a upraviť manipulujúceho zodpovedali nižšie uvedený kód:

   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
				


Je kľúčom k získaniu túto syntax pracovať v Visual Basic 6.0 najprv Dim premenná poľa ako variant a potom ReDim to tak že stáva variant obsahuje pole reťazcov. Teraz ste pripravení na testovanie Server. Nastaviť prestávke bodov v kóde Visual Basic 6.0, pred a po výzve na príkaz Zoradiť. Spustenie aplikácie Visual Basic 6.0, kliknite na položku Command1 a používať hodinky okno skontrolovať hodnoty pre v.

ODKAZY

Ďalšie informácie zobrazíte kliknutím na nasledujúce čísla článkov databázy Microsoft Knowledge Base:
122287Limity Visual Basic 3.0 &amp; Disptest ako automatizácie radiče
131046 Binary.exe prenos binárnych údajov pomocou OLE automatizácie
131086 Používanie bezpečných polia do automatizácie
140202 MFCArray pomocou bezpečné polia v MFC automatizácie
122289 Absolvovanie štruktúr v OLE automatizácie
154172 Ako prejsť binárne údaje medzi ovládací prvok ActiveX a VB
Systémy Microsoftu denníkaJúna 1996, „Q&A OLE"Don políčka.

(c) Microsoft Corporation 1997, všetky práva vyhradené. Príspevky Shawn W. Karri, Microsoft Corporation.

Vlastnosti

ID článku: 167668 - Posledná kontrola: 17. októbra 2011 - Revízia: 2.0
Informácie v tomto článku sa týkajú nasledujúcich produktov:
  • Microsoft Foundation Class Library 4.2, pri použití s produktom:
    • Microsoft Visual C++ 2.1
    • Microsoft Visual C++ 2.2
    • Microsoft Visual C++ 4.0 Standard Edition
    • Microsoft Visual C++ 4.2 Enterprise Edition
    • Microsoft Visual C++ 5.0 Enterprise Edition
    • Microsoft Visual C++ 5.0 Professional Edition
    • Microsoft Visual C++ .NET 2002 Standard Edition
  • Microsoft Visual C++ .NET 2003 Standard Edition
Kľúčové slová: 
kbautomation kbFAQ kbhowto kbmt KB167668 KbMtsk
Strojovo preložené
DÔLEŽITÉ: Tento článok bol preložený pomocou softvéru na strojový preklad od spoločnosti Microsoft, nie prekladateľom. Spoločnosť Microsoft ponúka články preložené prekladateľmi aj strojovo preložené články, vďaka čomu máte možnosť prístupu ku všetkým článkom databázy Knowledge Base vo svojom jazyku. Strojovo preložený článok však nie je vždy perfektný. Môže obsahovať chyby týkajúce sa slovnej zásoby, syntaxe alebo gramatiky, podobne ako cudzinec môže robiť chyby, keď rozpráva vašim jazykom. Spoločnosť Microsoft nenesie zodpovednosť za akékoľvek nepresnosti, chyby alebo škody spôsobené akýmkoľvek nepresným prekladom obsahu alebo jeho použitím zo strany zákazníkov. Spoločnosť Microsoft softvér na strojový preklad pravidelne aktualizuje.
Pokiaľ chcete vidieť anglickú verziu článku, kliknite sem:167668

Odošlite odozvu

 

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