Làm thế nào để vượt qua một SafeArray dây trong một biến thể * giữa Visual C++ và Visual Basic 6.0

QUAN TRỌNG: Bài viết này được dịch bằng phần mềm dịch máy của Microsoft chứ không phải do con người dịch. Microsoft cung cấp các bài viết do con người dịch và cả các bài viết do máy dịch để bạn có thể truy cập vào tất cả các bài viết trong Cơ sở Kiến thức của chúng tôi bằng ngôn ngữ của bạn. Tuy nhiên, bài viết do máy dịch không phải lúc nào cũng hoàn hảo. Loại bài viết này có thể chứa các sai sót về từ vựng, cú pháp hoặc ngữ pháp, giống như một người nước ngoài có thể mắc sai sót khi nói ngôn ngữ của bạn. Microsoft không chịu trách nhiệm về bất kỳ sự thiếu chính xác, sai sót hoặc thiệt hại nào do việc dịch sai nội dung hoặc do hoạt động sử dụng của khách hàng gây ra. Microsoft cũng thường xuyên cập nhật phần mềm dịch máy này.

Nhấp chuột vào đây để xem bản tiếng Anh của bài viết này:167668
Bài viết này đã được lưu trữ. Bài viết được cung cấp "nguyên trạng" và sẽ không còn được cập nhật nữa.
Chú ý Microsoft Visual C++.NET (2002) hỗ trợ cả hai mã được quản lý mô hình được cung cấp bởi Microsoft.NET Framework và nguồn gốc không được quản lý Microsoft Windows mã mô hình. Thông tin trong bài viết này chỉ áp dụng cho không được quản lý Visual c ++ mã.
TÓM TẮT
Khi bạn nhìn vào các thông tin có sẵn trên đi qua SafeArrays giữa Visual C++ và Visual Basic 6.0, vượt qua hầu hết SafeArray trong một tham số của kiểu biến thể. Trong MFC, dịch này thành một "biến thể const & varName"tham số.

Để thay thế, bài viết này khám phá làm thế nào để vượt qua một phiên bản *, mà trong MFC sẽ được công bố như là một "biến thể viễn * varName" tham số.

Tại sao bạn nên sử dụng một phương pháp qua khác? Bởi vì hầu hết các ứng dụng cho phép sửa đổi cho một SafeArray thông qua tại một phiên bản, nhưng không phải tất cả. Trong Excel 95, bạn có thể vượt qua một SafeArray trong một phiên bản với một Visual C++ hệ phục vụ, sửa đổi các giá trị trong máy chủ, trở về SafeArray sửa đổi, và không có không có sự thay đổi trong Excel 95. Một lý do để sử dụng kỹ thuật này là để làm việc xung quanh một giới hạn trong Visual Basic 6.0 khi bạn sử dụng đầu ràng buộc.
THÔNG TIN THÊM
Để chứng minh khái niệm này, bắt đầu với một mới "MFC AppWizard(exe) "dự án được gọi là StrArray. Trong "Bước 3 của 6," chọn Tự động hóa, bấm Kết thúc, và sau đó nhấp vào Ok để tạo ra các tập tin dự án.

LƯU Ý: Nếu sử dụng Visual Studio.NET: tạo ra một mới "MFC ứng dụng" dự án được gọi là StrArray. Trên các Tính năng nâng cao tab, chọn Tự động hóa, và sau đó nhấp vào Kết thúc để tạo ra các tập tin dự án.

Bây giờ tạo một đĩa đơn phương pháp tự động hóa bằng cách sử dụng ClassWizard. Trong ClassWizard, chọn "cstrarraydoc" Theo "tên lớp:". Bấm vào các Tự động hóa tab và Click vào Thêm phương pháp. Nhập các giá trị sau vào hộp thoại thêm phương pháp:

LƯU Ý: Nếu sử dụng Visual Studio.NET: thêm một sử dụng phương pháp tự động hóa đơn "Lớp View". Mở rộng cây lớp xem và tìm kiếm VCCOdeIDLLibrary lối vào. Tìm giao diện IStrArray dưới nút đó. Nhấp chuột phải vào giao diện, và sau đó chọn Thêm phương pháp. Nhập các giá trị sau vào hộp thoại thêm phương pháp:
   External Name : Sort   Internal Name : Sort   Return Type   : long   Parameter List:      Name       : vArray      Type       : VARIANT*				


Nhấp vào OkChỉnh sửa mã.

Để thực hiện phương pháp phân loại, sử dụng phương pháp FastSort MFCARRAY mẫu đã đề cập trong tài liệu tham khảo phần dưới đây. Điều này cho phép bạn để xem những khác biệt giữa đi qua tham số như là một "XD Phiên bản & varName"và một"Phiên bản * varName". Sửa đổi phương pháp sắp xếp như sau:

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


Bây giờ bạn có thể xây dựng và thử nghiệm các máy chủ tự động hóa. Sau khi bạn xây dựng các máy chủ, chạy nó như là một độc lập để đăng ký nó. Chạy Visual Basic 6.0 và tạo ra một dự án mới Visual Basic 6.0. Đặt một nút trong mẫu và Sửa đổi xử lý để phù hợp với mã dưới đây:

   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				


Điều quan trọng để nhận được cú pháp này để làm việc trong Visual Basic 6.0 là lần đầu tiên Dim mảng biến như là một biến thể, và sau đó ReDim nó như vậy là nó trở thành một biến thể chứa một mảng của chuỗi. Bây giờ bạn đã sẵn sàng để thử nghiệm các hệ phục vụ. Thiết lập break điểm trong Visual Basic 6.0 mã trước và sau khi cuộc gọi để sắp xếp. Chạy ứng dụng Visual Basic 6.0, bấm Command1 và sử dụng các xem cửa sổ để kiểm tra các giá trị cho v.
THAM KHẢO
Để biết thêm chi tiết, nhấp vào số bài viết sau để xem các bài viết trong cơ sở kiến thức Microsoft:
122287Giới hạn của Visual Basic 3,0 &amp; Disptest như bộ điều khiển tự động hóa
131046 Binary.exe chuyển dữ liệu nhị phân bằng cách sử dụng tự động hóa OLE
131086 Sử dụng các mảng an toàn trong tự động hóa
140202 MFCArray bằng cách sử dụng an toàn mảng trong MFC tự động hóa
122289 Đi qua các cấu trúc trong OLE tự động hóa
154172 Làm thế nào để vượt qua dữ liệu nhị phân giữa một điều khiển ActiveX và BB
Hệ thống Microsoft JournalTháng Sáu 1996, "Q&A OLE" bởi Don hộp.

(c) Microsoft Công ty cổ phần năm 1997, tất cả các quyền. Những đóng góp của Shawn W. Karr, Tập đoàn Microsoft.

Cảnh báo: Bài viết này được dịch tự động

Thuộc tính

ID Bài viết: 167668 - Xem lại Lần cuối: 12/04/2015 16:54:25 - Bản sửa đổi: 2.0

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

  • kbnosurvey kbarchive kbautomation kbFAQ kbhowto kbmt KB167668 KbMtvi
Phản hồi