Bir SafeArray dizelerin bir VARIANT * Visual C++ ile Visual Basic 6.0 arasında geçirmek hakkında

Makale çevirileri Makale çevirileri
Makale numarası: 167668 - Bu makalenin geçerli olduğu ürünleri görün.
Not Microsoft Visual C++ .NET (2002), Microsoft .NET Framework tarafından sağlanan bir yönetilen kod model hem de yerel Microsoft Windows kod modeli yönetilmeyen destekler. Bu makaledeki bilgiler yalnızca yönetilmeyen Visual C++ kod uygulanır.
Hepsini aç | Hepsini kapa

Özet

Visual C++ ile Visual Basic 6.0, çoğu arasındaki SafeArray SafeArray bir parametre geçirmek geçirilmesi üzerinde bilgi baktığınızda, VARIANT yazın. MFC içinde bu bir "Sabit bir VARIANT & varName" parametresi çevirir.

Alternatif olarak, bu makalede, bir VARIANT, MFC bir "* VARIANT FAR varName" parametresi olarak bildirilen *, geçirilecek nasıl anlatıyor.

Neden, üzerinde diğer bir yöntem kullanmalısınız? Çoğu uygulama, bir VARIANT, ancak tüm geçirilen bir SafeArray değişiklikler izin vermek için. Excel 95'te, bir SafeArray içinde bir VARIANT bir Visual C++ için geçirebilirsiniz sunucu, sunucu değerleri değiştirmek, değiştirilmiş olan SafeArray, dönmek ve Excel 95'te herhangi bir değişiklik yok. Bu yöntemi kullanmak üzere başka bir nedenle erken bağlama kullandığınızda, Visual Basic 6. 0'daki bir sınırlamaya geçici bir çözüm sağlamaktır.

Daha fazla bilgi

Bu kavram göstermek için <a0></a0>, StrArray adlı yeni bir "MFC AppWizard(exe)" proje ile başlatın. "Adım 3, 6," Automation ' ı seçin, sonra da son ' u tıklatın ve proje dosyalarını oluşturmak için Tamam ' ı tıklatın.

Not: Visual Studio. NET'i kullanarak,: bir yeni "MFC uygulaması" oluştur StrArray adlı bir proje. Gelişmiş Özellikler sekmesindeki Automation ' ı seçin ve sonra da <a2>proje dosyalarını oluşturmak için son</a2>'ı tıklatın.

Şimdi bir tek Otomasyon yöntemi ClassWizard kullanarak oluşturun. ClassWizard içinde <a0>altında seçin "CStrArrayDoc" "sınıf adı:". Otomasyon sekmesini tıklatın ve Yöntemi, Add'i tıklatın. Aşağıdaki değerleri yöntem Ekle</a1> iletişim kutusuna girin:

Not: Visual Studio. NET'i kullanarak,: "Sınıf Görünüm" kullanarak tek bir Otomasyon yöntem Ekle. Sınıf görünüm ağacını genişletin ve için VCCOdeIDLLibrary Arama girdisi. Bu düğüm altında IStrArray arabirimi bulun. Arabirimi sağ tıklatın ve sonra da Ekleme yöntemi seçin. Aşağıdaki değerleri yöntem Ekle</a1> iletişim kutusuna girin:
   External Name : Sort
   Internal Name : Sort
   Return Type   : long
   Parameter List:

      Name       : vArray
      Type       : VARIANT*
				


Tamam ' ı ve kodu Düzenle ' yi tıklatın.

Sıralama yöntemi uygulamak için aşağıdaki BAşVURULAR bölümünde MFCARRAY örnek FastSort yöntemini kullanın. Bu parametre, bir "sabit bir VARIANT & varName" geçirerek arasındaki farklar görmenize olanak verir ve bir "VARıANT * varName". Sıralama yöntemi aşağıdaki gibi değiştirin:

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

   }
				


Şimdi oluşturmak ve Otomasyon sunucusu sınayın. Sunucu oluşturun, sonra çalıştırın kaydetmek için bir bağımsız. Visual Basic 6. 0'ı çalıştırın ve yeni bir Visual Basic 6.0 projesi oluşturun. Formda bir düğmeyi getirin ve işleyicisi, aşağıdaki kod eşleşecek şekilde değiştirin:

   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 ile çalışmak için bu sözdizimini almak için bu anahtar, ilk Byt dizi değişkeni olarak bir türevi için ve böylece bu dize dizisi içeren bir varyant duruma ReDim. Sunucu sınamak artık hazırsınız. Kesme noktaları, Visual Basic 6.0 kod önce veya sonra sıralama çağrısı ayarlayın. Visual Basic 6.0 uygulamasını çalıştırın, Command1'ı tıklatın ve sonra da Gözcü penceresi v değerleri denetlemek için kullanın.

Referanslar

Daha fazla bilgi için, Microsoft Bilgi Bankası'ndaki makaleleri görüntülemek üzere aşağıdaki makale numaralarını tıklatın:
122287Visual Basic 3.0 & Disptest sınırlarını Otomasyon denetleyicileri olarak
131046Binary.exe OLE otomasyonunu kullanarak ikili veri aktarımları
131086Güvenli diziler, otomasyon kullanma
140202MFCArray güvenli diziler MFC Otomasyon kullanma
122289OLE otomasyonunu yapılarını geçirme
154172Ikili veri, bir ActiveX denetimi VB arasında geçirmek için
Microsoft Sistem günlüğü, Haziran 1996 "Soru ve Cevap OLE" olarak Don Box.

(c) 1997 Microsoft Corporation, tüm hakları saklıdır. Katkıyı Shawn W. Karr, Microsoft Corporation.

Özellikler

Makale numarası: 167668 - Last Review: 21 Kasım 2006 Salı - Gözden geçirme: 3.1
Bu makaledeki bilginin uygulandığı durum:
  • Microsoft Foundation Class Library 4.2, Ne zaman ne ile kullanilir:
    • 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 Aboneliği
    • 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
Anahtar Kelimeler: 
kbmt kbautomation kbfaq kbhowto KB167668 KbMttr
Machine-translated Article
ÖNEMLİ: Bu makale, bir kişi tarafından çevrilmek yerine, Microsoft makine-çevirisi yazılımı ile çevrilmiştir. Microsoft size hem kişiler tarafından çevrilmiş, hem de makine-çevrisi ile çevrilmiş makaleler sunar. Böylelikle, bilgi bankamızdaki tüm makalelere, kendi dilinizde ulaşmış olursunuz. Bununla birlikte, makine tarafından çevrilmiş makaleler mükemmel değildir. Bir yabancının sizin dilinizde konuşurken yapabileceği hatalar gibi, makale; kelime dağarcığı, söz dizim kuralları veya dil bilgisi açısından yanlışlar içerebilir. Microsoft, içeriğin yanlış çevrimi veya onun müşteri tarafından kullanımından doğan; kusur, hata veya zarardan sorumlu değildir. Microsoft ayrıca makine çevirisi yazılımını sıkça güncellemektedir.
Makalenin İngilizcesi aşağıdaki gibidir:167668

Geri Bildirim Ver

 

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