كيفية تمرير SafeArray سلاسل في VARIANT * بين Visual C++ و Visual Basic 6.0

هام: تمت ترجمة هذا المقال باستخدام برنامج ترجمة آلية لشركة مايكروسوفت بدلاً من الاستعانة بمترجم بشري. تقدم شركة مايكروسوفت كلاً من المقالات المترجمة بواسطة المترجمين البشر والمقالات المترجمة آليًا وبالتالي ستتمكن من الوصول إلى كل المقالات الموجودة في قاعدة المعرفة الخاصة بنا وباللغة الخاصة بك. بالرغم من ذلك، فإن المقالة المترجمة آليًا لا تكون دقيقة دائمًا وقد تحتوي على أخطاء إملائية أو لغوية أو نحوية، مثل تلك الأخطاء الصادرة عن متحدث أجنبي عندما يتحدث بلغتك. لا تتحمل شركة مايكروسوفت مسئولية عدم الدقة أو الأخطاء أو الضرر الناتج عن أية أخطاء في ترجمة المحتوى أو استخدامه من قبل عملائنا. تعمل شركة مايكروسوفت باستمرار على ترقية برنامج الترجمة الآلية

اضغط هنا لرابط المقالة باللغة الانجليزية167668
تمت أرشفة هذه المقالة. وتظهر "كما هي" ولن يتم تحديثها بعد الآن.
ملاحظة يعتمد Microsoft Visual C++ .NET (2002) نموذج التعليمات البرمجية المدارة التي تم توفيرها من قبل Microsoft .NET Framework وبصورة نموذج التعليمات البرمجية غير المُدارة Microsoft Windows الأصلي. تنطبق المعلومات الواردة في هذه المقالة فقط على التعليمات البرمجية غير المُدارة Visual C++.
الموجز
عند النظر إلى معلومات متوفرة على تمرير SafeArrays بين Visual C++ و Visual Basic 6.0 معظم تمرير SafeArray في معلمة اكتب VARIANT. في MFC ، هذا يترجم إلى معلمة "VARIANT const & اسم المتغير".

وكبديل لذلك، استكشاف هذه المقالة كيفية تمرير VARIANT * ، التي في MFC سوف يكون قد تم تعريف كمعلمة "FAR VARIANT * varname".

لماذا ينبغي يمكنك استخدام أسلوب واحد عبر الآخر حيث تسمح معظم التطبيقات التعديلات SafeArray الذي تم إدخاله على VARIANT ولكن ليس جميعها. في Excel 95 يمكنك تمرير SafeArray في VARIANT إلى Visual C++ الملقم، تعديل القيم الموجودة في الملقم ، ترجع SafeArray المعدلة ولا يوجد أي تغيير في Excel 95. سبب آخر استخدام هذه التقنية للتعامل مع وجود قيود في Visual Basic 6.0 عند استخدام الربط المبكر.
معلومات أخرى
إلى عرض هذا المفهوم ، ابدأ مشروع "MFC AppWizard(exe)" جديد يسمى StrArray. في "الخطوة 3 من 6" ، حدد التنفيذ انقر فوق إنهاء ثم انقر فوق موافق لإنشاء ملفات المشروع.

ملاحظة: استخدام Studio.NET مرئية: إنشاء جديد "تطبيق MFC" تسمى StrArray المشروع. ضمن علامة التبويب "ميزات متقدمة" ، وحدد التنفيذ ثم انقر فوق "إنهاء" لإنشاء ملفات المشروع.

الآن إنشاء أسلوب التنفيذ التلقائي واحد باستخدام ClassWizard. في ClassWizard ، حدد "CStrArrayDoc" ضمن "اسم فئة:". انقر فوق علامة التبويب التنفيذ ثم انقر فوق إضافة أسلوب. إدخال القيم التالية في مربع الحوار "إضافة أسلوب":

ملاحظة: استخدام Studio.NET مرئية: إضافة أسلوب التنفيذ التلقائي مفرد باستخدام "طريقة العرض" الفئة"". قم بتوسيع شجرة "عرض فئة" ثم ابحث عن VCCOdeIDLLibrary الإدخال. ابحث عن واجهة IStrArray تحت هذه العقدة. انقر بزر الماوس الأيمن فوق الواجهة ثم حدد إضافة أسلوب. إدخال القيم التالية في مربع الحوار "إضافة أسلوب":
   External Name : Sort   Internal Name : Sort   Return Type   : long   Parameter List:      Name       : vArray      Type       : VARIANT*				


انقر فوق "موافق" و "تحرير التعليمات البرمجية.

لتنفيذ أسلوب فرز استخدام الأسلوب FastSort عينة MFCARRAY المذكورة في قسم "المراجع" أدناه. ويتيح لك ذلك بمشاهدة الاختلافات بين تمرير المعلمة بمثابة "VARIANT const & اسم المتغير" و "VARIANT * 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 إلى Dim الأول متغير الصفيف كمتغير ويتم ReDim بحيث يصبح متغير يحتوي على صفيف سلاسل. أنت الآن جاهز لاختبار الملقم. تعيين نقاط فاصل في التعليمات البرمجية Visual Basic 6.0 قبل وبعد استدعاء فرز. تشغيل تطبيق Visual Basic 6.0 انقر فوق Command1 ثم استخدام إطار المراقبة إلى تحقق من قيم v.
مراجع
لمزيد من المعلومات، انقر فوق أرقام المقالات التالية لعرضها في "قاعدة المعارف لـ Microsoft:
122287حدود Disptest & 3.0 Visual Basic مثل وحدات تحكم التنفيذ التلقائي
131046Binary.exe ينقل البيانات الثنائية باستخدام التنفيذ التلقائي لـ OLE
131086استخدام صفائف آمن في التنفيذ التلقائي
140202استخدام صفائف آمن في التنفيذ التلقائي MFC MFCArray
122289تمرير بنيات في التنفيذ التلقائي لـ OLE
154172طريقة لتمرير البيانات الثنائية بين تحكم ActiveX و VB
يومية أنظمة Microsoft ، 1996 يونيو "Q&A OLE" عن طريق مربع Don.

(ج) ١٩٩٧ شركة Microsoft ، كافة حقوق محجوز. المساهمات قبل Shawn غرب Karr ، Microsoft Corporation.

تحذير: تمت ترجمة هذه المقالة تلقائيًا

خصائص

رقم الموضوع: 167668 - آخر مراجعة: 12/04/2015 16:54:15 - المراجعة: 3.1

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

  • kbnosurvey kbarchive kbmt kbautomation kbfaq kbhowto KB167668 KbMtar
تعليقات