Como passar uma SafeArray de seqüências de caracteres em um VARIANT 1 entre o Visual C++ e Visual Basic 6.0

Traduções deste artigo Traduções deste artigo
ID do artigo: 167668 - Exibir os produtos aos quais esse artigo se aplica.
Observação Microsoft Visual C++ .NET (2002) oferece suporte o modelo de código gerenciado que é fornecido pelo Microsoft .NET Framework e o modelo de código do Windows de Microsoft nativo não gerenciado. As informações neste artigo se aplicam somente ao código do Visual C++ não gerenciado.
Expandir tudo | Recolher tudo

Sumário

Quando você examinar as informações disponíveis na passagem que SafeArrays entre o Visual C++ e Visual Basic 6.0, a maioria passar um parâmetro de SafeArray digite VARIANT. No MFC, isso se traduz em um parâmetro "VARIANT const & varName".

Como alternativa, este artigo explora como passar um VARIANT 1, que irá ser declarada como um parâmetro "VARIANT FAR 1 varName" no MFC.

Por que você deve usar um método a outro? Porque a maioria dos aplicativos permite modificações para uma SafeArray passado um VARIANT, mas não todos. No Excel 95, você pode passar uma SafeArray em um VARIANT para o Visual C++ servidor, modificar os valores no servidor, retornar SafeArray modificado, e não há nenhuma alteração no Excel 95. Outro motivo para usar essa técnica é para solucionar uma limitação no Visual Basic 6.0, quando usar ligação inicial.

Mais Informações

Para demonstrar esse conceito, comece com um novo projeto de "MFC AppWizard(exe)" chamado StrArray. No "Etapa 3 de 6", selecione automação , clique em Concluir e, em seguida, clique em OK para gerar os arquivos de projeto.

Observação : se usando o Visual Studio.NET: criar um novo "MFC aplicativo" projeto chamado StrArray. Na guia Recursos avançados , selecione automação e clique em Concluir para gerar os arquivos de projeto.

Crie agora um método de automação único usando ClassWizard. Na ClassWizard, selecione "CStrArrayDoc" em "nome da classe:". Clique na guia de automação e clique em Add Method . Insira os seguintes valores na caixa de diálogo Add Method:

Observação : se usando o Visual Studio.NET: adicionar um método de automação único usando "Class View". Expanda a árvore Class View e procure o VCCOdeIDLLibrary entrada. Localizar a interface IStrArray sob esse nó. Clique a interface com o botão direito do mouse e selecione Add Method . Insira os seguintes valores na caixa de diálogo Add Method:
   External Name : Sort
   Internal Name : Sort
   Return Type   : long
   Parameter List:

      Name       : vArray
      Type       : VARIANT*
				


Clique em OK e Editar código .

Para implementar o método Sort, use o método FastSort da amostra MFCARRAY mencionado na seção referências abaixo. Isso lhe permite ver as diferenças entre passar o parâmetro como um "VARIANT const & varName" e um "VARIANT 1 varName". Modifique o método Sort da seguinte forma:

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

   }
				


Agora você pode criar e testar o servidor de automação. Depois de criar o servidor, execute-o como autônomo para registrá-lo. Execute o Visual Basic 6.0 e crie um novo projeto Visual Basic 6.0. Coloque um botão no formulário e modificar o manipulador para corresponder ao código de abaixo:

   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
				


A chave para obter essa sintaxe para trabalhar no Visual Basic 6.0 é Dim primeiro a variável de matriz como uma variante e, em seguida, o ReDim para que ele se torne uma variante contendo uma matriz de seqüências de caracteres. Agora você está pronto para testar o servidor. Definir pontos de interrupção no código do Visual Basic 6.0 antes e após a chamada para classificar. Executar o aplicativo Visual Basic 6.0, clique em Command1 e use a janela de inspeção para verificar valores de v.

Referências

Para obter mais informações, clique nos números abaixo para ler os artigos na Base de dados de Conhecimento da Microsoft:
122287Limites do Visual Basic 3.0 & Disptest como controladores de automação
131046Binary.exe transfere dados binários usando automação de OLE
131086Uso de matrizes seguras na automação
140202MFCArray usando matrizes seguras na automação do MFC
122289Passar estruturas de automação de OLE
154172Como passar dados binários entre um controle ActiveX e VB
Microsoft Systems Journal , junho de 1996, "OLE de perguntas e respostas" por Don Box.

(c) 1997 Microsoft Corporation, todos os direitos reservados. Contribuições de Shawn w. Karr, Microsoft Corporation.

Propriedades

ID do artigo: 167668 - Última revisão: terça-feira, 21 de novembro de 2006 - Revisão: 3.1
A informação contida neste artigo aplica-se a:
  • Microsoft Foundation Class Library 4.2 nas seguintes plataformas
    • 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
Palavras-chave: 
kbmt kbautomation kbfaq kbhowto KB167668 KbMtpt
Tradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine Translation ou MT), não tendo sido portanto traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 167668

Submeter comentários

 

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