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

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
Artikel ini telah diarsipkan. Artikel ditawarkan dalam bentuk "apa adanya" dan tidak akan dapat diperbarui lagi.
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.
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.

Peringatan: Artikel ini telah diterjemahkan secara otomatis

Properti

ID Artikel: 167668 - Tinjauan Terakhir: 12/04/2015 16:54:20 - Revisi: 2.0

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

  • kbnosurvey kbarchive kbautomation kbFAQ kbhowto kbmt KB167668 KbMtid
Tanggapan