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

Ö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
Bu makale arşivlenmiştir. "Olduğu gibi" sunulmaktadır ve bundan sonra güncelleştirilmeyecektir.
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.
Ö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.

Uyarı: Bu makalenin çevirisi otomatik olarak yapılmıştır

Özellikler

Makale No: 167668 - Son İnceleme: 12/04/2015 16:54:25 - Düzeltme: 3.1

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

  • kbnosurvey kbarchive kbmt kbautomation kbfaq kbhowto KB167668 KbMttr
Geri bildirim