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

ข้อมูลสำคัญ: บทความนี้แปลโดยซอฟต์แวร์การแปลด้วยคอมพิวเตอร์ของ Microsoft แทนที่จะเป็นนักแปลที่เป็นบุคคล Microsoft มีบทความที่แปลโดยนักแปลและบทความที่แปลด้วยคอมพิวเตอร์ เพื่อให้คุณสามารถเข้าถึงบทความทั้งหมดในฐานความรู้ของเรา ในภาษาของคุณเอง อย่างไรก็ตาม บทความที่แปลด้วยคอมพิวเตอร์นั้นอาจมีข้อบกพร่อง โดยอาจมีข้อผิดพลาดในคำศัพท์ รูปแบบการใช้ภาษาและไวยากรณ์ เช่นเดียวกับกรณีที่ชาวต่างชาติพูดผิดเมื่อพูดภาษาของคุณ Microsoft ไม่มีส่วนรับผิดชอบต่อความคลาดเคลื่อน ความผิดพลาดหรือความเสียหายที่เกิดจากการแปลเนื้อหาผิดพลาด หรือการใช้บทแปลของลูกค้า และ Microsoft มีการปรับปรุงซอฟต์แวร์การแปลด้วยคอมพิวเตอร์อยู่เป็นประจำ

ต่อไปนี้เป็นฉบับภาษาอังกฤษของบทความนี้: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

คำเตือน: บทความนี้ได้รับการแปลโดยอัตโนมัติ

คุณสมบัติ

รหัสบทความ: 167668 - การตรวจสอบครั้งสุดท้าย: 12/04/2015 16:54:24 - ฉบับแก้ไข: 2.0

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

  • kbnosurvey kbarchive kbautomation kbfaq kbhowto kbmt KB167668 KbMtth
คำติชม