วิธีการผ่าน SafeArray ของสตริงการในตัวแปร * ระหว่าง c ++ Visual และ Visual Basic 6.0

การแปลบทความ การแปลบทความ
หมายเลขบทความ (Article ID): 167668 - ผลิตภัณฑ์ที่เกี่ยวข้องในบทความนี้
หมายเหตุ:Microsoft Visual c ++.NET (2002) สนับสนุนรูปแบบรหัสที่ได้รับการจัดการที่ให้ไว้ โดย Framework Microsoft .NET และไม่มีการจัดการมาตรฐาน Microsoft Windows รหัสรูปแบบ ข้อมูลในบทความนี้สามารถใช้ได้เฉพาะกับรหัส c ++แสดงผลที่ไม่มีการจัดการ
ขยายทั้งหมด | ยุบทั้งหมด

สรุป

เมื่อคุณดูข้อมูลที่พร้อมใช้งานบนฝึก SafeArrays ระหว่าง c ++ Visual และ Visual Basic 6.0 ส่วนใหญ่ผ่าน SafeArray ที่ในพารามิเตอร์ของ พิมพ์ตัวแปร ใน MFC ซึ่งแปลเป็นพารามิเตอร์ "ตัวแปร const & varName"

เป็นแทน บทความนี้สำรวจวิธีการส่งต่อตัวแปร * ซึ่งใน MFC ประกาศเป็นพารามิเตอร์ "ตัวแปร FAR * varName"

เหตุใดคุณควรใช้วิธีการหนึ่งไปอีกหรือไม่ เนื่องจากโปรแกรมประยุกต์ส่วนใหญ่จะอนุญาตให้มีการปรับเปลี่ยน SafeArray ที่ส่งผ่านในตัวแปร แต่ไม่ทั้งหมด ใน Excel 95 คุณสามารถผ่าน SafeArray แบบในตัวแปรไปยัง c ++ Visual เซิร์ฟเวอร์ ปรับเปลี่ยนค่าในเซิร์ฟเวอร์ กลับ SafeArray ถูกปรับเปลี่ยน และไม่มีการเปลี่ยนแปลงใน Excel 95 ไม่ได้ เหตุผลอื่น ๆ ใช้เทคนิคนี้คือการ หลีกเลี่ยงข้อจำกัดแบบใน Visual Basic 6.0 เมื่อคุณใช้การรวมก่อนหน้า

ข้อมูลเพิ่มเติม

เมื่อต้องการแสดงให้เห็นถึงแนวคิดนี้ การเริ่มการทำงานกับโครงการ "MFC AppWizard(exe)" ใหม่เรียก StrArray ใน "ขั้นตอนที่ 3 ของ 6 เลือกดำเนินการอัตโนมัติคลิกเสร็จสิ้นแล้ว คลิกตกลงเมื่อต้องการสร้างแฟ้มโครงการ

หมายเหตุ:: ถ้าใช้ Studio.NET Visual: สร้างแบบใหม่ "MFC แอพพลิเคชัน" โครงการที่เรียกว่า StrArray ในการคุณลักษณะขั้นสูงแท็บ การเลือกดำเนินการอัตโนมัติแล้ว คลิกเสร็จสิ้นเมื่อต้องการสร้างแฟ้มโครงการ

ขณะนี้ สร้างวิธีดำเนินการอัตโนมัติเดียวโดยใช้ ClassWizard ใน ClassWizard เลือก "CStrArrayDoc" ภายใต้ "ชื่อคลาส: " คลิกการดำเนินการอัตโนมัติแท็บและคลิกวิธีเพิ่ม. ป้อนค่าต่อไปนี้ลงในกล่องโต้ตอบของวิธีเพิ่ม:

หมายเหตุ:: ถ้าใช้ Studio.NET Visual: เพิ่ม "มุมมองคลา" การใช้วิธีดำเนินการอัตโนมัติที่เดียวกัน ขยายมุมมองคลาแผนภูมิ และค้นหา VCCOdeIDLLibrary รายการ ค้นหาอินเทอร์เฟซ IStrArray ภายใต้โหนนั้น คลิกขวาที่อินเทอร์เฟส และจากนั้น เลือกวิธีเพิ่ม. ป้อนค่าต่อไปนี้ลงในกล่องโต้ตอบของวิธีเพิ่ม:
   External Name : Sort
   Internal Name : Sort
   Return Type   : long
   Parameter List:

      Name       : vArray
      Type       : VARIANT*
				


คลิกตกลงและแก้ไขรหัส.

ใช้วิธีการเรียงลำดับ ใช้เมธอด FastSort ของตัวอย่าง MFCARRAY ที่กล่าวถึงในส่วนการอ้างอิงด้านล่าง ซึ่งช่วยให้คุณเห็นความแตกต่างระหว่างการส่งผ่านพารามิเตอร์เป็นแบบ "ตัวแปร const & varName" และใน "ตัวแปร * varName" ปรับเปลี่ยนวิธีการเรียงลำดับต่อไปนี้:

   ...
   #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 จะมิติแรกตัวแปรแถวลำดับตามตัวแปร แล้ว ReDim ดังนั้นจะกลายเป็นตัวแปรที่ประกอบด้วยสตริงการเป็นแถว ขณะนี้ คุณก็พร้อมที่ทดสอบเซิร์ฟเวอร์ ตั้งค่าจุดการหยุดพักในโค้ด Visual Basic 6.0 ก่อน และ หลังการเรียกการเรียงลำดับ เรียกใช้โปรแกรมประยุกต์ของ Visual Basic 6.0 คลิก Command1 และสามารถใช้หน้าต่างดูการตรวจสอบค่าสำหรับ v

ข้อมูลอ้างอิง

หากต้องการทราบข้อมูลเพิ่มเติม โปรดคลิกที่หมายเลขบทความต่อไปนี้เพื่อดูบทความใน Microsoft Knowledge Base::
122287ข้อจำกัดของ Visual Basic 3.0 &amp; Disptest เป็นตัวควบคุมการดำเนินการอัตโนมัติ
131046Binary.exe ถ่ายโอนข้อมูลแบบไบนารีที่ใช้การดำเนินการอัตโนมัติ OLE
131086การใช้อาร์เรย์ที่ปลอดภัยในการดำเนินการอัตโนมัติ
140202MFCArray ใช้อาร์เรย์ที่ปลอดภัยในการดำเนินการอัตโนมัติ MFC
122289โครงสร้างการฝึกในการดำเนินการอัตโนมัติ OLE
154172วิธีการส่งต่อข้อมูลไบนารีระหว่างการใช้ตัวควบคุม activex และ VB
สมุดรายวันที่ระบบของ Microsoftเดือน 1996 มิถุนายน กล่อง "Q&A OLE" โดยจะ

(c) Microsoft Corporation 1997 สิทธิ์ทั้งหมดที่สำรองไว้ contributions โดย Shawn W. Karr, Microsoft Corporation

คุณสมบัติ

หมายเลขบทความ (Article ID): 167668 - รีวิวครั้งสุดท้าย: 12 ตุลาคม 2553 - Revision: 2.0
ใช้กับ
  • Microsoft Foundation Class Library 4.2 เมื่อใช้กับ:
    • 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++ 2002 Standard Edition
  • Microsoft Visual C++ .NET 2003 Standard Edition
Keywords: 
kbautomation kbfaq kbhowto kbmt KB167668 KbMtth
แปลโดยคอมพิวเตอร์
ข้อมูลสำคัญ: บทความนี้แปลโดยซอฟต์แวร์การแปลด้วยคอมพิวเตอร์ของ Microsoft แทนที่จะเป็นนักแปลที่เป็นบุคคล Microsoft มีบทความที่แปลโดยนักแปลและบทความที่แปลด้วยคอมพิวเตอร์ เพื่อให้คุณสามารถเข้าถึงบทความทั้งหมดในฐานความรู้ของเรา ในภาษาของคุณเอง อย่างไรก็ตาม บทความที่แปลด้วยคอมพิวเตอร์นั้นอาจมีข้อบกพร่อง โดยอาจมีข้อผิดพลาดในคำศัพท์ รูปแบบการใช้ภาษาและไวยากรณ์ เช่นเดียวกับกรณีที่ชาวต่างชาติพูดผิดเมื่อพูดภาษาของคุณ Microsoft ไม่มีส่วนรับผิดชอบต่อความคลาดเคลื่อน ความผิดพลาดหรือความเสียหายที่เกิดจากการแปลเนื้อหาผิดพลาด หรือการใช้บทแปลของลูกค้า และ Microsoft มีการปรับปรุงซอฟต์แวร์การแปลด้วยคอมพิวเตอร์อยู่เป็นประจำ
ต่อไปนี้เป็นฉบับภาษาอังกฤษของบทความนี้:167668

ให้ข้อเสนอแนะ

 

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