Πώς να περάσει 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 *, όπου το MFC θα δηλωθεί ως ένα "ΠΑΡΑΛΛΑΓΉ ΆΠΩ * Όνομα_μεταβλητής" η παράμετρος.

Γιατί πρέπει να χρησιμοποιείτε μία μέθοδο από την άλλη; Επειδή Οι περισσότερες εφαρμογές επιτρέπουν τροποποιήσεις SafeArray που διαβιβάστηκε σε μια ΜΕΤΑΒΛΗΤΉ, αλλά δεν είναι όλες. Στο Excel 95, μπορείτε να περάσετε SafeArray σε μια μεταβλητή τύπου VARIANT σε Visual C++ διακομιστής, τροποποιήστε τις τιμές στο διακομιστή, επιστρέψτε το τροποποιημένο SafeArray και δεν υπάρχει αλλαγή στο Excel 95. Ένας άλλος λόγος για να χρησιμοποιήσετε αυτή την τεχνική είναι να λειτουργεί γύρω από τον περιορισμό σε Visual Basic 6.0 όταν χρησιμοποιείτε δέσμευση νωρίς.

Περισσότερες πληροφορίες

Για να αποδειχθεί αυτή η έννοια, ξεκινήστε με μια νέα MFC" AppWizard(exe) "έργου που ονομάζεται StrArray. Επιλέξτε "Βήμα 3 από 6" Αυτοματοποίηση, κάντε κλικ στο κουμπί Τέλος, και στη συνέχεια κάντε κλικ στο κουμπί OK Για να δημιουργήσετε αρχεία έργου.

ΣΗΜΕΊΩΣΗ: Εάν χρησιμοποιείτε το 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*
				


Κάντε κλικ στο κουμπί OK AND Επεξεργασία κώδικα.

Για να υλοποιήσετε τη μέθοδο ταξινόμησης, χρησιμοποιήστε τη μέθοδο FastSort MFCARRAY δείγματος που αναφέρεται στην ενότητα "ΑΝΑΦΟΡΈΣ" παρακάτω. Αυτό επιτρέπει Μπορείτε να δείτε τις διαφορές μεταξύ διέρχεται η παράμετρος ως "const ΠΑΡΑΛΛΑΓΉ & Όνομα_μεταβλητής"και ένα"VARIANT * Όνομα_μεταβλητής". Για να τροποποιήσετε τη μέθοδο ταξινόμησης ως ακολουθεί:

   ...
   #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, κάντε κλικ εντολή1 και χρησιμοποιήστε το ρολόι το παράθυρο για να ελέγξετε τις τιμές για v.

Αναφορές

Για περισσότερες πληροφορίες, κάντε κλικ στους αριθμούς των άρθρων παρακάτω, για να προβάλετε τα άρθρα της Γνωσιακής Βάσης της Microsoft:
122287Όρια της Visual Basic 3.0 &amp; Disptest ως ελεγκτές αυτοματισμού
131046 Binary.exe μεταφορές δυαδικών δεδομένων χρησιμοποιώντας Αυτοματοποίηση OLE
131086 Χρήση ασφαλούς πινάκων σε αυτοματισμού
140202 MFCArray χρησιμοποιώντας ασφαλή πίνακες αυτοματισμού MFC
122289 Διαβίβαση δομές αυτοματισμού OLE
154172 Πώς να περάσει δυαδικά δεδομένα μεταξύ ενός στοιχείου ελέγχου ActiveX και VB
Συστήματα Microsoft εγγραφώνΙουνίου 1996, "Q&A OLE" από το πλαίσιο Don.

(c) Microsoft Corporation 1997, κάθε νόμιμου δικαιώματος. Συνεισφορές από Shawn Ολοκλ. Karr, Microsoft Corporation.

Ιδιότητες

Αναγν. άρθρου: 167668 - Τελευταία αναθεώρηση: Πέμπτη, 26 Μαΐου 2011 - Αναθεώρηση: 4.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++ .NET 2002 Standard Edition
  • Microsoft Visual C++ .NET 2003 Standard Edition
Λέξεις-κλειδιά: 
kbautomation kbFAQ kbhowto kbmt KB167668 KbMtel
Μηχανικά μεταφρασμένο
ΣΗΜΑΝΤΙΚΟ: Αυτό το άρθρο είναι προϊόν λογισμικού μηχανικής μετάφρασης της 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