如何在 VARIANT * 傳遞的字串 SafeArray Visual C++ 和 Visual Basic 6.0 之間

文章翻譯 文章翻譯
文章編號: 167668 - 檢視此文章適用的產品。
附註Microsoft Visual C++.NET (2002),支援 Managed 程式碼模型所提供的 Microsoft.NET Framework 和不受管理的原生 Microsoft Windows 程式碼模型。本文資訊僅適用於不受管理的 Visual C++ 程式碼。
全部展開 | 全部摺疊

結論

當您查看在 Visual C++ 和 Visual Basic 6.0 大部分之間 SafeArrays [SafeArray 傳入的參數傳遞的可用資訊時鍵入 VARIANT。在 MFC 中,這將轉譯成 「 const VARIANT & varName 」 參數。

另一個方法本文探討如何傳遞一個 VARIANT *,其在 MFC 中將宣告為"VARIANT FAR * varName 」 參數。

為什麼應該使用一種方法透過其他?因為大多數的應用程式允許 SafeArray,傳入了一個 VARIANT 但並非所有的修改。Excel 95 中您可以傳遞一個 SafeArray 中一個 VARIANT 給 Visual C++ 伺服器,修改伺服器中的值,傳回已修改的 SafeArray,而且沒有在 Excel 95 中的沒有變更。若要使用這項技巧的另一個原因是解決在 Visual Basic 6.0 中的限制,當您使用早期繫結。

其他相關資訊

若要示範這個概念,請以新的 「 MFC AppWizard(exe) 「 專案開始稱為 StrArray。在 「 步驟 3 的 6,"選取 自動化,按一下 [完成],然後再按一下 [[確定] 來產生專案檔案]。

注意: 如果使用的 Visual Studio.NET: 建立一個新 「 MFC 應用程式 」 呼叫 StrArray 的專案。在 [進階功能] 索引標籤上選取 自動化,然後按一下 [[完成] 以產生專案檔案。

現在建立使用 ClassWizard 單一自動化方法。在 ClassWizard,選取 CStrArrayDoc"下 」 類別名稱:"。按一下 [自動化] 索引標籤,然後按一下 [加入方法。[加入方法] 對話方塊中輸入下列值:

注意: 如果使用的 Visual Studio.NET: 新增單一自動化方法,使用 [類別檢視 」。展開 [類別檢視樹狀目錄,並尋找 [VCCOdeIDLLibrary 項目。尋找 IStrArray 介面,該節點之下。用滑鼠右鍵按一下介面],然後選取 [加入方法。在 [加入方法] 對話方塊中輸入下列值:
   External Name : Sort
   Internal Name : Sort
   Return Type   : long
   Parameter List:

      Name       : vArray
      Type       : VARIANT*
				


按一下 [確定]編輯程式碼

若要實作 Sort 方法,使用 [MFCARRAY 範例下列參考節中所提到的 FastSort 方法]。這可讓您查看差異為一個 「 const VARIANT & varName 」 傳遞參數和一個 「 VARIANT * varName 」。修改 Sort 方法,如下所示:

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

   }
				


現在可以建置並測試自動化伺服器。建置伺服器之後執行它作為獨立的註冊它。執行 Visual Basic 6.0 中,並建立新的 Visual Basic 6.0 專案。在表單上放置一個按鈕,並修改處理常式,以符合下列程式碼:

   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 中運作的關鍵是第一個 Dim 陣列變數當作一個 Variant,並使它成為包含字串陣列的 Variant 然後 ReDim。現在您已經準備好測試伺服器。之前及之後呼叫至排序,請在 Visual Basic 6.0 中程式碼中設定中斷點。執行 Visual Basic 6.0 應用程式、 按一下 Command1 並使用 [監看式] 視窗檢查 v 的值。

?考

如需詳細資訊按一下 [下面的文件編號,檢視 「 Microsoft 知識庫 」 中 「 文件]:
122287Visual Basic 3.0 與 disptest 設為自動化控制站的限制
131046Binary.exe 轉送使用 OLE 自動化的二進位資料
131086在自動化的安全陣列的使用
140202使用安全陣列中 MFC 自動化 MFCArray
122289在 OLE 自動化傳遞結構
154172如何將 ActiveX 控制項與 VB 之間傳遞二進位資料
Microsoft 系統日誌,六月 1996年"問答 OLE 」 由 Don 方塊。

(c) Microsoft Corporation 1997,保留所有的權限。由 Shawn 工時 Karr,Microsoft Corporation 的貢獻。

屬性

文章編號: 167668 - 上次校閱: 2006年11月21日 - 版次: 3.1
這篇文章中的資訊適用於:
  • Microsoft Foundation Class Library 4.2?應用於:
    • 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 Subscription
    • 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
關鍵字:?
kbmt kbautomation kbfaq kbhowto KB167668 KbMtzh
機器翻譯
重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。
按一下這裡查看此文章的英文版本:167668
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。

提供意見

 

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