Bagaimana untuk melewati SafeArray string dalam VARIAN antara Visual C++ dan Visual Basic 6.0

ID Artikel: 167668 - Melihat produk di mana artikel ini berlaku.
Catatan Microsoft Visual C++.NET (2002) mendukung kedua kode dikelola model yang disediakan oleh Microsoft.NET Framework dan asli tidak dikelola Microsoft Windows kode model. Informasi di dalam artikel ini hanya berlaku untuk unmanaged Visual C++ kode.
Perbesar semua | Perkecil semua

RINGKASAN

Ketika Anda melihat informasi yang tersedia di lewat SafeArrays antara Visual C++ dan Visual Basic 6.0, sebagian besar lewat SafeArray di parameter jenis VARIAN. Dalam MFC, ini diterjemahkan ke dalam "VARIAN const & varName"parameter.

Sebagai alternatif, artikel ini mengeksplorasi bagaimana lulus VARIAN *, yang dalam MFC akan dinyatakan sebagai "VARIAN jauh * varName" parameter.

Mengapa harus Anda gunakan salah satu metode dari yang lainnya? Karena sebagian besar aplikasi memungkinkan modifikasi SafeArray berlalu dalam, tetapi tidak semua. Dalam Excel 95, Anda dapat melewati SafeArray dalam VARIAN untuk Visual C++ server, mengubah nilai-nilai di server, kembali SafeArray diubah, dan ada tidak ada perubahan dalam Excel 95. Alasan lain untuk menggunakan teknik ini adalah untuk bekerja sekitar pembatasan dalam Visual Basic 6.0 ketika Anda menggunakan ikatan lama.

INFORMASI LEBIH LANJUT

Untuk menunjukkan konsep ini, mulai dengan baru "MFC AppWizard(exe) "proyek yang disebut StrArray. Dalam "Langkah 3 dari 6," Pilih Otomatisasi, klik Menyelesaikan, lalu klik Oke untuk menghasilkan file proyek.

CATATAN: Jika menggunakan Visual Studio.NET: membuat "MFC aplikasi baru" proyek yang disebut StrArray. Pada Fitur lanjutan tab, pilih Otomatisasi, lalu klik Menyelesaikan untuk menghasilkan file proyek.

Sekarang membuat satu otomatisasi menggunakan ClassWizard metode. Dalam ClassWizard, pilih "CStrArrayDoc" di bawah "nama kelas:". Klik Otomatisasi tab dan klik Menambahkan metode. Masukkan nilai berikut ke dalam kotak dialog Tambah metode:

CATATAN: Jika menggunakan Visual Studio.NET: menambahkan metode menggunakan otomatisasi tunggal "Kelas View. Memperluas pohon kelas lihat dan mencari VCCOdeIDLLibrary entri. Menemukan antarmuka IStrArray di bawah simpul tersebut. Klik kanan antarmuka, kemudian pilih Menambahkan metode. Masukkan nilai berikut ke dalam kotak dialog Tambah metode:
   External Name : Sort
   Internal Name : Sort
   Return Type   : long
   Parameter List:

      Name       : vArray
      Type       : VARIANT*
				


Klik Oke dan Mengedit kode.

Untuk menerapkan metode semacam, menggunakan metode FastSort sampel MFCARRAY yang disebutkan dalam bagian referensi di bawah ini. Hal ini memungkinkan Anda dapat melihat perbedaan antara melewati parameter sebagai "const VARIAN & varName"dan"VARIAN * varName". Mengubah metode semacam sebagai berikut:

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

   }
				


Sekarang Anda dapat membangun dan menguji server Otomatisasi. Setelah Anda membangun server, menjalankannya sebagai berdiri sendiri untuk mendaftarkannya. Menjalankan Visual Basic 6.0 dan membuat proyek baru Visual Basic 6.0. Menempatkan tombol pada bentuk dan memodifikasi penangan untuk mencocokkan kode di bawah ini:

   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
				


Kunci untuk mendapatkan sintaks ini untuk bekerja di Visual Basic 6.0 adalah pertama Dim variabel array sebagai varian, dan kemudian ReDim jadi itu menjadi varian yang mengandung sebuah array dari string. Sekarang Anda siap untuk menguji server. Menetapkan titik-titik istirahat dalam kode Visual Basic 6.0 sebelum dan setelah panggilan untuk mengurutkan. Menjalankan aplikasi Visual Basic 6.0, klik Command1 dan menggunakan jam jendela untuk memeriksa nilai v.

REFERENSI

Untuk informasi selengkapnya, klik nomor artikel berikut ini untuk melihat artikel di Pangkalan Pengetahuan Microsoft:
122287Batas-batas Visual Basic 3.0 &amp; Disptest sebagai otomatisasi controller
131046 Binary.exe transfer data biner yang menggunakan OLE otomatisasi
131086 Menggunakan array aman dalam otomatisasi
140202 MFCArray menggunakan array aman di MFC otomatisasi
122289 Lewat struktur di OLE automation
154172 Bagaimana untuk melewati data biner antara kontrol ActiveX dan BB
Sistem Microsoft JournalJuni 1996, "Q&A OLE" oleh Don kotak.

(c) Microsoft Perusahaan 1997, All Rights Reserved. Kontribusi oleh Shawn W. Karr, Microsoft Corporation.

Properti

ID Artikel: 167668 - Kajian Terakhir: 15 September 2011 - Revisi: 2.0
Berlaku bagi:
  • Microsoft Foundation Class Library 4.2, ketika digunakan dengan:
    • 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
Kata kunci: 
kbautomation kbFAQ kbhowto kbmt KB167668 KbMtid
Penerjemahan Mesin
PENTING: Artikel ini diterjemahkan menggunakan perangkat lunak mesin penerjemah Microsoft dan bukan oleh seorang penerjemah. Microsoft menawarkan artikel yang diterjemahkan oleh seorang penerjemah maupun artikel yang diterjemahkan menggunakan mesin sehingga Anda akan memiliki akses ke seluruh artikel baru yang diterbitkan di Pangkalan Pengetahuan (Knowledge Base) dalam bahasa yang Anda gunakan. Namun, artikel yang diterjemahkan menggunakan mesin tidak selalu sempurna. Artikel tersebut mungkin memiliki kesalahan kosa kata, sintaksis, atau tata bahasa, hampir sama seperti orang asing yang berbicara dalam bahasa Anda. Microsoft tidak bertanggung jawab terhadap akurasi, kesalahan atau kerusakan yang disebabkan karena kesalahan penerjemahan konten atau penggunaannya oleh para pelanggan. Microsoft juga sering memperbarui perangkat lunak mesin penerjemah.
Klik disini untuk melihat versi Inggris dari artikel ini:167668

Berikan Masukan