Come passare un SafeArray di stringhe in un VARIANT * tra Visual c ++ e Visual Basic 6.0

Traduzione articoli Traduzione articoli
Identificativo articolo: 167668 - Visualizza i prodotti a cui si riferisce l?articolo.
Nota Microsoft Visual c ++ .NET (2002) supporta sia il modello di codice gestito fornito da Microsoft .NET Framework che il modello di codice non gestito nativo di Microsoft Windows. Le informazioni contenute in questo articolo si applicano solo al codice Visual C++ non gestito.
Espandi tutto | Chiudi tutto

Sommario

Quando si esaminano le informazioni disponibili nel passaggio di che SafeArray tra Visual c ++ e Visual Basic 6.0, la maggior parte passare un parametro di SafeArray digitare VARIANT. In MFC, questo si traduce in un parametro "VARIANT const & nomevariabile".

In alternativa, in questo articolo vengono illustrati come passare un VARIANT *, che, in MFC, sarà dichiarato come un parametro di "VARIANT FAR * l'argomento nomevariabile".

Perché è necessario utilizzare un metodo rispetto a altro? Poiché la maggior parte delle applicazioni consentono un SafeArray passati in un valore VARIANT, ma non tutte le modifiche. In Excel 95, è possibile passare un SafeArray VARIANT a un Visual c ++ server, modificare i valori nel server, restituire SafeArray modificato, e non esiste nessuna modifica in Excel 95. Un altro motivo per utilizzare questa tecnica è per risolvere un problema in Visual Basic 6.0 quando si utilizza l'associazione anticipata.

Informazioni

Per illustrare questo concetto, iniziare con un nuovo progetto "MFC AppWizard(exe)" chiamato StrArray. Nel "Passaggio 3 di 6," selezionare automazione , fare clic su Fine e quindi fare clic su OK per generare i file di progetto.

Nota : se si utilizza Visual Studio.NET: Create a "MFC Application" nuovo progetto denominato StrArray. Nella scheda Caratteristiche avanzate selezionare automazione e quindi scegliere Fine per generare i file di progetto.

Creare un metodo di automazione singolo utilizzando Creazione guidata classe. Nella classe, selezionare "CStrArrayDoc" in "nome classe:". Scegliere la scheda di automazione , quindi Aggiungi metodo . Immettere i seguenti valori nella finestra di dialogo Aggiungi metodo:

Nota : se si utilizza Visual Studio.NET: aggiunta di un metodo di automazione singolo utilizzando "Classe View". Espandere la struttura di visualizzazione classi e individuare il VCCOdeIDLLibrary voce. Trovare l'interfaccia IStrArray sotto tale nodo. Fare clic con il pulsante destro del mouse sull'interfaccia e quindi selezionare Aggiungi metodo . Immettere i seguenti valori nella finestra di dialogo Aggiungi metodo:
   External Name : Sort
   Internal Name : Sort
   Return Type   : long
   Parameter List:

      Name       : vArray
      Type       : VARIANT*
				


Fare clic su OK e Modifica di codice .

Per implementare il metodo di ordinamento, utilizzare il metodo di FastSort dell'esempio MFCARRAY menzionato nella sezione riferimenti riportati di seguito. Questo consente di visualizzare le differenze tra passando il parametro come un "VARIANT const & nomevariabile" e "VARIANT * nomevariabile". Modificare il metodo di ordinamento come segue:

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

   }
				


È ora possibile creare e testare il server di automazione. Dopo aver creato il server, è necessario eseguirlo come autonomo per la registrazione. Eseguire Visual Basic 6.0 e creare un nuovo progetto di Visual Basic 6.0. Inserire un pulsante nel modulo e modificare il gestore in modo che corrisponda il codice riportato di seguito:

   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
				


La chiave per ottenere questa sintassi funziona in Visual Basic 6.0 è Dim prima la variabile di matrice come variant e ReDim in modo che diventi un valore variant contenente una matrice di stringhe. Ora si è pronti per verificare il server. Impostare punti di interruzione nel codice Visual Basic 6.0 prima e dopo la chiamata a Sort. Eseguire l'applicazione di Visual Basic 6.0 fare clic su Command1 e utilizzare la finestra Espressioni di controllo per verificare i valori per v.

Riferimenti

Per ulteriori informazioni, fare clic sui numeri degli articoli della Microsoft Knowledge Base riportato di seguito:
122287Limiti di Visual Basic 3.0 & Disptest come controller di automazione
131046Binary.exe trasferisce i dati binari utilizzando l'automazione OLE
131086Utilizzo di matrici protette nell'automazione
140202MFCArray in matrici protette di automazione MFC
122289Passaggio delle strutture di automazione OLE
154172Come passare i dati binari tra un controllo ActiveX e VB
Microsoft Systems Journal , giugno 1996 "OLE di domande e risposte" di Don Box.

(c) Microsoft Corporation 1997, tutti i diritti riservati. Con il contributo di Shawn w. Karr, Microsoft Corporation.

Proprietà

Identificativo articolo: 167668 - Ultima modifica: martedì 21 novembre 2006 - Revisione: 3.1
Le informazioni in questo articolo si applicano a:
  • Microsoft Foundation Class Library 4.2 alle seguenti piattaforme
    • 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
Chiavi: 
kbmt kbautomation kbfaq kbhowto KB167668 KbMtit
Traduzione automatica articoli
Il presente articolo è stato tradotto tramite il software di traduzione automatica di Microsoft e non da una persona. Microsoft offre sia articoli tradotti da persone fisiche sia articoli tradotti automaticamente da un software, in modo da rendere disponibili tutti gli articoli presenti nella nostra Knowledge Base nella lingua madre dell?utente. Tuttavia, un articolo tradotto in modo automatico non è sempre perfetto. Potrebbe contenere errori di sintassi, di grammatica o di utilizzo dei vocaboli, più o meno allo stesso modo di come una persona straniera potrebbe commettere degli errori parlando una lingua che non è la sua. Microsoft non è responsabile di alcuna imprecisione, errore o danno cagionato da qualsiasi traduzione non corretta dei contenuti o dell?utilizzo degli stessi fatto dai propri clienti. Microsoft, inoltre, aggiorna frequentemente il software di traduzione automatica.
Clicca qui per visualizzare la versione originale in inglese dell?articolo: 167668
LE INFORMAZIONI CONTENUTE NELLA MICROSOFT KNOWLEDGE BASE SONO FORNITE SENZA GARANZIA DI ALCUN TIPO, IMPLICITA OD ESPLICITA, COMPRESA QUELLA RIGUARDO ALLA COMMERCIALIZZAZIONE E/O COMPATIBILITA' IN IMPIEGHI PARTICOLARI. L'UTENTE SI ASSUME L'INTERA RESPONSABILITA' PER L'UTILIZZO DI QUESTE INFORMAZIONI. IN NESSUN CASO MICROSOFT CORPORATION E I SUOI FORNITORI SI RENDONO RESPONSABILI PER DANNI DIRETTI, INDIRETTI O ACCIDENTALI CHE POSSANO PROVOCARE PERDITA DI DENARO O DI DATI, ANCHE SE MICROSOFT O I SUOI FORNITORI FOSSERO STATI AVVISATI. IL DOCUMENTO PUO' ESSERE COPIATO E DISTRIBUITO ALLE SEGUENTI CONDIZIONI: 1) IL TESTO DEVE ESSERE COPIATO INTEGRALMENTE E TUTTE LE PAGINE DEVONO ESSERE INCLUSE. 2) I PROGRAMMI SE PRESENTI, DEVONO ESSERE COPIATI SENZA MODIFICHE, 3) IL DOCUMENTO DEVE ESSERE DISTRIBUITO INTERAMENTE IN OGNI SUA PARTE. 4) IL DOCUMENTO NON PUO' ESSERE DISTRIBUITO A SCOPO DI LUCRO.

Invia suggerimenti

 

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