Способ передачи SafeArray строки в тип VARIANT * Visual C++ и Visual Basic 6.0

Переводы статьи Переводы статьи
Код статьи: 167668 - Vizualiza?i produsele pentru care se aplic? acest articol.
Примечание Microsoft Visual C++.NET (2002) поддерживает управляемый код модель, предоставляемых платформой Microsoft.NET Framework и неуправляемый машинный код Модель кода Microsoft Windows. В данной статье применима только к неуправляемый код Visual C++.
Развернуть все | Свернуть все

Аннотация

Если взглянуть на информацию на передачу Объекты SAFEARRAY Visual C++ и Visual Basic 6.0, большинство передать массив SafeArray в параметр типа VARIANT. В MFC, это превращается в "const VARIANT & параметр Имя_переменной".

Кроме того, в данной статье рассматриваются способы Передача типа VARIANT *, которой в MFC будет объявлено как «ДАЛЬНЕГО VARIANT * Имя_переменной» параметр.

Почему следует использовать один метод по умолчанию Так как Большинство приложений предоставляют изменения SafeArray переданное значение типа VARIANT, но не все. В Microsoft Excel 95 можно передать массив SafeArray в ВАРИАНТЕ Visual C++ сервер, измените значения в сервере, возврат измененного SafeArray и нет никаких изменений в Excel 95. Другая причина для реализации этого метода будет работать вокруг ограничение в Visual Basic 6.0, использование раннего связывания.

Дополнительная информация

Чтобы продемонстрировать эту концепцию, начните с нового MFC" AppWizard(exe) "проект с именем StrArray. Выберите «Шаг 3 из 6» Автоматизация, нажмите кнопку Окончание, а затем нажмите кнопку ОК Чтобы создать файлы проекта.

ПРИМЕЧАНИЕ: Если с помощью Visual Studio.NET: Создание нового приложения MFC «» проект с именем StrArray. На Дополнительные возможности Вкладка выбора Автоматизация, а затем нажмите кнопку Окончание Чтобы создать файлы проекта.

Теперь создайте один метод автоматизации, используя ClassWizard. В ClassWizard выберите «cstrarraydoc» в поле «имя класса: ". Нажмите кнопку Автоматизация вкладки и нажмите кнопку Добавить метод. Введите следующие значения в диалоговом окне Добавить метод:

ПРИМЕЧАНИЕ: Если с помощью Visual Studio.NET: добавить с помощью автоматизации одного метода «Представление классов». Разверните дерево представления классов и искать VCCOdeIDLLibrary запись. Найти интерфейс IStrArray в этом узле. Щелкните правой кнопкой мыши интерфейс, а затем выберите Добавить метод. Введите следующие значения в диалоговом окне Добавить метод:
   External Name : Sort
   Internal Name : Sort
   Return Type   : long
   Parameter List:

      Name       : vArray
      Type       : VARIANT*
				


Нажмите кнопку ОК и Редактирование кода.

Чтобы реализовать метод сортировки, используйте метод FastSort MFCARRAY-пример говорится в приведенном ниже разделе ССЫЛОК. Это позволяет можно увидеть различия между передачей параметров как "const ВАРИАНТ & Имя_переменной"и"VARIANT * Имя_переменной". Измените метод сортировки, как выглядит следующим образом:

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

   }
				


Теперь можно построить и проверить сервер автоматизации. После того как вы построение сервера, запускать как отдельное для его регистрации. Запустите Visual Basic 6.0 и создайте новый проект Visual Basic 6.0. Поместить в форму кнопку и Измените обработчик, который соответствует следующий код:

   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
				


Ключ для получения этого синтаксиса для работы в Visual Basic 6.0 Сначала Затенить переменную массива как variant и ReDim так что он становится объекта variant, содержащего массив строк. Теперь все готово для проверки сервер. Задание точек останова в коде Visual Basic 6.0 до и после вызова для сортировки. Запуск приложения Visual Basic 6.0 и выберите Command1 использовать часы окно для проверки значений для v.

Ссылки

Для получения дополнительных сведений щелкните следующие номера статей базы знаний Майкрософт:
122287Ограничения Visual Basic 3.0 &amp; Disptest как контроллеры автоматизации
131046 Binary.exe передача двоичных данных с помощью OLE-автоматизации
131086 Использование безопасных массивов в автоматизации
140202 Использование безопасных массивов в автоматизации MFC MFCArray
122289 Передача структур в OLE-автоматизации
154172 Передача двоичных данных между элементом управления ActiveX и VB
Журнал системы корпорации МайкрософтИюнь 1996 года «Q&A OLE», Дон Бокс.

(c) Корпорация Майкрософт Корпорация 1997, все права защищены. Взносы, Шон Karr Вт, Корпорация Майкрософт.

Свойства

Код статьи: 167668 - Последний отзыв: 3 июня 2011 г. - Revision: 4.0
Информация в данной статье относится к следующим продуктам.
  • Microsoft Foundation Class Library 4.2 на следующих платформах
    • 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
Ключевые слова: 
kbautomation kbFAQ kbhowto kbmt KB167668 KbMtru
Переведено с помощью машинного перевода
ВНИМАНИЕ! Перевод данной статьи был выполнен не человеком, а с помощью программы машинного перевода, разработанной корпорацией Майкрософт. Корпорация Майкрософт предлагает вам статьи, переведенные как людьми, так и средствами машинного перевода, чтобы у вас была возможность ознакомиться со статьями базы знаний KB на родном языке. Однако машинный перевод не всегда идеален. Он может содержать смысловые, синтаксические и грамматические ошибки, подобно тому как иностранец делает ошибки, пытаясь говорить на вашем языке. Корпорация Майкрософт не несет ответственности за неточности, ошибки и возможный ущерб, причиненный в результате неправильного перевода или его использования. Корпорация Майкрософт также часто обновляет средства машинного перевода.
Эта статья на английском языке:167668

Отправить отзыв

 

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