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

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
Este artigo foi arquivado. É oferecido "como está" e não será mais atualizado.
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.
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: 12/04/2015 16:54:23 - Revisão: 3.1

Microsoft Foundation Class Library 4.2, Microsoft Visual C++ .NET 2003 Standard Edition

  • kbnosurvey kbarchive kbmt kbautomation kbfaq kbhowto KB167668 KbMtpt
Comentários
ERROR: at System.Diagnostics.Process.Kill() at Microsoft.Support.SEOInfrastructureService.PhantomJS.PhantomJSRunner.WaitForExit(Process process, Int32 waitTime, StringBuilder dataBuilder, Boolean isTotalProcessTimeout)