Como passar um SafeArray de cadeias de VARIANT * entre Visual C++ e Visual Basic 6.0

Traduções de Artigos Traduções de Artigos
Artigo: 167668 - Ver produtos para os quais este artigo se aplica.
Nota Microsoft Visual C++ .NET (2002) suporta o modelo de código gerido que é fornecido pelo Microsoft .NET Framework e o modelo de código do Microsoft Windows nativo não gerido. As informações neste artigo aplicam-se apenas ao código de Visual C++ não gerido.
Expandir tudo | Reduzir tudo

Sumário

Quando vê as informações disponíveis no SafeArrays entre Visual C++ e Visual Basic 6.0, a maior parte passar a SafeArray um parâmetro de passagem escreva VARIANT. No MFC, isto traduz para um parâmetro "VARIANT constante & nomevar".

Como alternativa, este artigo explora a passar uma VARIANT *, que no MFC vai ser declarado como um parâmetro de "VARIANT FAR * nomevar".

Por que razão deve utilizar um método de relação ao outro? Porque a maioria das aplicações permite modificações uma SafeArray transmitida uma VARIANT, mas nem todos os. No Excel 95, pode passar um SafeArray numa VARIANT para Visual C++ servidor, modifique os valores no servidor, devolução SafeArray modificado, e não existe nenhuma alteração no Excel 95. Outra razão para utilizar esta técnica é resolver uma limitação no Visual Basic 6.0, quando utiliza o enlace inicial.

Mais Informação

Para demonstrar este conceito, comece com um novo projecto "MFC AppWizard(exe)" denominado StrArray. Em "Passo 3 de 6," seleccionar automatização , clique em Concluir e, em seguida, clique em OK para gerar ficheiros de projecto.

Nota : Se utilizar o Visual Studio.NET: criar um novo "aplicação MFC" projecto denominado StrArray. No separador Funções avançadas , seleccione automatização e clique em Concluir para gerar ficheiros de projecto.

Criar um método de automatização único utilizando ClassWizard. Na ClassWizard, seleccione "CStrArrayDoc" em "nome da classe:". Clique no separador de automatização e clique em Adicionar método . Introduza os seguintes valores na caixa de diálogo Adicionar método:

Nota : Se utilizar o Visual Studio.NET: adicionar um método de automatização único utilizando a 'Vista de classe'. Expandir a árvore de classe ver e procure o VCCOdeIDLLibrary entrada. Localize a interface IStrArray nesse nó. Clique com o botão direito do rato a interface e, em seguida, seleccione Adicionar método . Introduza os seguintes valores na caixa de diálogo Adicionar método:
   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 de ordenação, utilize o método FastSort do exemplo MFCARRAY mencionado na secção referências abaixo. Isto permite ver as diferenças entre passar o parâmetro como um "VARIANT constante & nomevar" e um "VARIANT * nomevar". Modificar o método de ordenação 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 pode criar e testar o servidor de automatização. Depois de criar o servidor, execute-o como autónoma para o registar. Executar o Visual Basic 6.0 e crie um novo projecto de Visual Basic 6.0. Coloque um botão no formulário e modifique o processador para corresponder ao código 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 esta sintaxe para trabalhar no Visual Basic 6.0 é p/Dim primeiro a variável de matriz como uma variante e ReDim-a para que se torne uma variante contendo uma matriz de cadeias. Agora, está pronto para testar o servidor. Definir pontos de quebra no código de Visual Basic 6.0 antes e depois da chamada para ordenar. Execute a aplicação de Visual Basic 6.0, clique em Command1 e utilize a janela de monitorização para verificar os valores de v.

Referências

Para obter mais informações, clique números de artigo que se seguem para visualizar os artigos na base de dados de conhecimento da Microsoft:
122287Limites do Visual Basic 3.0 & Disptest como controladores de automatização
131046Binary.exe transfere dados binários, utilizar a automatização OLE
131086Utilização de matrizes seguras de automatização
140202MFCArray utilizar matrizes seguras na automatização de MFC
122289Estruturas de passagem na automatização OLE
154172Como passar dados binários entre um controlo ActiveX e VB
Microsoft Systems Journal , Junho de 1996, "P & r OLE" por Don Box.

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

Propriedades

Artigo: 167668 - Última revisão: 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 revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes 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