Με τον τρόπο για να μεταβιβάσετε ένα όρισμα τύπου String μεταξύ της Visual Basic και του DLL C

Μεταφράσεις άρθρων Μεταφράσεις άρθρων
Αναγν. άρθρου: 187912 - Δείτε τα προϊόντα στα οποία αναφέρεται το συγκεκριμένο άρθρο.
Ανάπτυξη όλων | Σύμπτυξη όλων

Σε αυτήν τη σελίδα

Περίληψη

Όταν δημιουργείτε ένα C βιβλιοθήκη δυναμικής σύνδεσης (DLL) για χρήση με τη Visual Basic, είναι σημαντικό να θυμάστε ότι αντιμετωπίζουν διαφορετικά συμβολοσειρές C και της Visual Basic. Πρέπει να λάβετε κάθε προφύλαξη για να εξασφαλίσετε ότι όλες οι συμβολοσειρές διαβιβάζονται σωστά, διαφορετικά, ενδέχεται να παρουσιαστεί ένα ανεπανόρθωτο σφάλμα. Αυτό το άρθρο θα σας δείξει πώς να συντάξετε ένα αρχείο DLL C που λαμβάνει μια συμβολοσειρά ως παράμετρος μια λειτουργία και πώς μπορείτε να καλέσετε τη συνάρτηση που έχει εξαχθεί από μια εφαρμογή της Visual Basic.

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

Για να αναπτύξετε το αρχείο DLL C, είναι σημαντικό να γνωρίζετε τον τρόπο της Visual Basic χειρίζεται εσωτερικά συμβολοσειρές για να γνωρίζετε πώς αυτά θα μεταβιβαστούν σας λειτουργίες DLL. Πιο C συναρτήσεις αναμενόταν μια συμβολοσειρά που είναι μηδενικό τερματισμό, Πίνακας χαρακτήρων ASCII. Όμως, μια συμβολοσειρά αυτοματισμού ασφαλούς τύπου που ονομάζεται ένα BSTR χρησιμοποιεί η Visual Basic. Για την πλατφόρμα του Win32, ένα BSTR είναι μια μεγάλη δείκτης σε μια δομή εκχωρημένης μνήμης που περιέχει μια συμβολοσειρά χαρακτήρων Unicode και ένα πρόθεμα ακέραιος 32-bit, το οποίο αποθηκεύει το μήκος της συμβολοσειράς.

Μπορείτε να παραβλέπονται τα περισσότερα αυτής της διαφοράς, επειδή της Visual Basic θα μετατρέψει αυτόματα οποιαδήποτε BSTRs Unicode σε ASCII πριν από τη μεταφορά τους σε μια εξωτερική συνάρτηση. Ωστόσο, είναι το πρόβλημα με την παράμετρο, η ίδια. Από προεπιλογή, Visual Basic διαβιβάζει όλες τις μεταβλητές με αναφορά, συμπεριλαμβανομένων των συμβολοσειρών. Επειδή μια μεταβλητή BSTR είναι ένας δείκτης σε μια ακολουθία χαρακτήρων, όταν περάσει ο της Visual Basic από την αναφορά του στην πραγματικότητα διαβίβαση ενός δείκτη σε δείκτη σε μια συμβολοσειρά. Πιο C συναρτήσεις περιμένετε απλώς ένας δείκτης σε μια ακολουθία χαρακτήρων (όπως LPSTR).

Δημιουργία του αρχείου DLL C: Βήμα προς βήμα παράδειγμα

  1. Ανοίξτε το Visual C++ 5.0 και κάντε κλικ στο κουμπί "Δημιουργία" από το μενού αρχείο. Στη σελίδα "Έργα", επιλέξτε "Win32 βιβλιοθήκης δυναμικής σύνδεσης" και ονομάστε το έργο "StrSamp".
  2. Και πάλι, κάντε κλικ στο κουμπί "Δημιουργία" από το μενού αρχείο και επιλέξτε "Αρχείο προέλευσης C++". Στην καρτέλα "αρχεία", ονομάστε το αρχείο "StrSamp.c" και πατήστε το κουμπί OK.
  3. Επαναλάβετε το βήμα 2 και το χρόνο επιλογής "Αρχείο κειμένου" ως τύπο αρχείου. Ονομάστε το αρχείο "StrSamp.def" και πατήστε το κουμπί OK.
  4. Στη συνέχεια, προσθέστε τον παρακάτω κώδικα στο "StrSamp.c:"
          #include <windows.h>
    
          void __stdcall DisplayStringByVal(LPCSTR pszString)
          {
             //pszString is a pointer to a string
             MessageBox(NULL, pszString, "Display String ByVal",
                       MB_OK | MB_ICONINFORMATION);
          }
    
          void __stdcall DisplayStringByRef(LPCSTR* ppszString)
          {
             //ppszSting is a pointer to a pointer to a string
             MessageBox(NULL, *ppszString, "Display String ByRef",
                       MB_OK | MB_ICONINFORMATION);
          }
    
             void __stdcall FillString(LPSTR pszString, LONG cSize)
          {
             // Create a temp buffer with our string
             char buffer[] = "Hello from the C DLL!";
    
             // Copy our temp string to pszString
             // but check the size to make sure we have a buffer
             // big enough to hold the entire string.
             if (cSize > strlen(buffer))
                strcpy(pszString, buffer);
          }
    
          int __stdcall InStrRev(LPCSTR pszString, short iChar)
          {
             // This function is similar to Visual Basic's InStr function
             // except that it searches for the given ASCII character from
             // right to left, returning the character position of the
             // last occurrence (rather than the first) of the character
             // in the string.
             char* pszTmp;
             int nRet = 0;
    
             // Scan for iChar in pszString backwards
             pszTmp = strrchr(pszString, (int)iChar);
             if(pszTmp != NULL)
                nRet = pszTmp - pszString + 1;
    
             return nRet;
          }
    
    					
  5. Για να κάνετε τις λειτουργίες δυνατότητα εξαγωγής, προσθέστε τα εξής για να "StrSamp.def:"
          LIBRARY StrSamp
          DESCRIPTION 'Microsoft KB Sample DLL'
          EXPORTS
             DisplayStringByVal
             DisplayStringByRef
             FillString
             InStrRev
    
    					
  6. Η μεταγλώττιση του αρχείου DLL από το μενού της δομής. Όταν ολοκληρωθεί, αντιγράψτε το νέο αρχείο DLL στον κατάλογο της Visual Basic για τη δοκιμή.

Τη δοκιμή VB εφαρμογή: Παράδειγμα βήμα προς βήμα

  1. Δημιουργήστε ένα τυπικό έργο της Visual Basic και ονομάστε τον "StrTest". Φόρμα1 δημιουργείται από προεπιλογή.
  2. Προσθήκη τριών CommandButtons Φόρμα1.
  3. Στο παράθυρο κώδικα για Φόρμα1, προσθέστε τα ακόλουθα στην ενότητα γενικές δηλώσεις:
          Option Explicit
    
          Private Declare Sub DisplayStringByRef Lib "StrSamp.dll" _
             (sMyString As String)
          Private Declare Sub DisplayStringByVal Lib "StrSamp.dll" _
             (ByVal sMyString As String)
          Private Declare Sub FillString Lib "StrSamp.dll" _
             (ByVal sMyString As String, ByVal cBufferSize As Long)
          Private Declare Function InStrRev Lib "StrSamp.dll" _
             (ByVal sMyString As String, ByVal iChar As Integer) _
             As Long
    
    					
    Σημειώστε ότι οι περισσότερες από τις συμβολοσειρές δηλώνονται ByVal. Αυτό δεν σημαίνει ότι διαβίβαση αυτών των συμβολοσειρών με βάση την τιμή, ενώ αντίθετα, διαβιβάζοντας την τιμή της μεταβλητής BSTR με τιμή (Θυμηθείτε ότι μια μεταβλητή BSTR είναι ένας δείκτης σε μια συμβολοσειρά). Έτσι, η λέξη-κλειδί ByVal έχει ως αποτέλεσμα διαβιβάζοντας έναν μεγάλο δείκτη σε μια ακολουθία χαρακτήρων (LPSTR), αναμένεται ακριβώς τι το C συναρτήσεις.

  4. Προσθέστε τον ακόλουθο κώδικα για τα συμβάντα κλικ για καθένα από τα CommandButtons:
          Private Sub Command1_Click()
             Dim sTestString1 As String
             Dim sTestString2 As String
    
             sTestString1 = "This is my string passed to the dll by value."
             DisplayStringByVal sTestString1
    
             sTestString2 = "This is my string passed to the dll by reference."
             DisplayStringByRef sTestString2
    
          End Sub
    
          Private Sub Command2_Click()
             Dim sFillTest As String
    
             sFillTest = Space$(260)
             FillString sFillTest, 260
             MsgBox Trim$(sFillTest), vbInformation, "Fill String"
          End Sub
    
          Private Sub Command3_Click()
             Dim sPathString As String
             Dim sMsg As String
             Dim lCharPosition As Long
    
             sPathString = "C:\My Documents\Temp\Item.txt"
             lCharPosition = InStrRev(sPathString, Asc("\"))
    
             If CBool(lCharPosition) Then
                sMsg = "The file '" & Mid$(sPathString, lCharPosition + 1)
                sMsg = sMsg & "' is at this location:" & vbCrLf & vbCrLf
                sMsg = sMsg & Left$(sPathString, lCharPosition - 1)
                MsgBox sMsg, vbInformation, "InStrRev"
             Else
                MsgBox "Cannot find '/' in " & sPathString, vbCritical
            End If
    
          End Sub
    
    					
  5. Πιέστε το πλήκτρο F5 για να εκτελέσετε το έργο της Visual Basic στο IDE.

    ΣΗΜΕΙΩΣΗ: Εάν λάβετε ένα μήνυμα λάθους, ίσως επειδή η Visual Basic δεν μπορεί να βρει το αρχείο DLL. Βεβαιωθείτε ότι έχετε αντιγράψει το στον κατάλογο Visual Basic πριν να εκτελέσετε την εφαρμογή δοκιμής.

Αναφορές

Για λεπτομερείς πληροφορίες σχετικά με τον τρόπο δημιουργίας ενός αρχείου DLL C και χρήσης της Visual Basic, ανατρέξτε στο ακόλουθο άρθρο:
"DLL για αρχάριους" στη βιβλιοθήκη Microsoft Developer Network (MSDN) "VB5DLL.DOC" που βρίσκεται στο CD-ROM της Visual Basic 5.0 στο "Tools\Docs" κατάλογο.

Για πρόσθετες πληροφορίες, ανατρέξτε στο ακόλουθο άρθρο της Γνωσιακής Βάσης της Microsoft (Knowledge Base):
142840: Απαιτήσεις της Visual Basic για λειτουργίες του εξαγόμενου αρχείου DLL

Ιδιότητες

Αναγν. άρθρου: 187912 - Τελευταία αναθεώρηση: Σάββατο, 18 Δεκεμβρίου 2010 - Αναθεώρηση: 2.0
Οι πληροφορίες σε αυτό το άρθρο ισχύουν για:
  • Microsoft Visual Basic 5.0 Learning Edition
  • Microsoft Visual Basic 5.0 Professional Edition
  • Microsoft Visual Basic 6.0 Professional Edition
  • Microsoft Visual Basic 5.0 Enterprise Edition
  • Microsoft Visual C++ 5.0 Enterprise Edition
  • Microsoft Visual C++ 5.0 Professional Edition
Λέξεις-κλειδιά: 
kbapi kbdll kbhowto kbmt KB187912 KbMtel
Μηχανικά μεταφρασμένο
ΣΗΜΑΝΤΙΚΟ: Αυτό το άρθρο είναι προϊόν λογισμικού μηχανικής μετάφρασης της Microsoft και όχι ανθρώπινης μετάφρασης. Η Microsoft σάς προσφέρει άρθρα που είναι προϊόντα ανθρώπινης αλλά και μηχανικής μετάφρασης έτσι ώστε να έχετε πρόσβαση σε όλα τα άρθρα της Γνωσιακής Βάσης μας στη δική σας γλώσσα. Ωστόσο, ένα άρθρο που έχει προκύψει από μηχανική μετάφραση δεν είναι πάντα άριστης ποιότητας. Ενδέχεται να περιέχει λεξιλογικά, συντακτικά ή γραμματικά λάθη, όπως ακριβώς τα λάθη που θα έκανε ένας μη φυσικός ομιλητής επιχειρώντας να μιλήσει τη γλώσσα σας. Η Microsoft δεν φέρει καμία ευθύνη για τυχόν ανακρίβειες, σφάλματα ή ζημίες που προκύψουν λόγω τυχόν παρερμηνειών στη μετάφραση του περιεχομένου ή χρήσης του από τους πελάτες της. Επίσης, η Microsoft πραγματοποιεί συχνά ενημερώσεις στο λογισμικό μηχανικής μετάφρασης.
Η αγγλική έκδοση αυτού του άρθρου είναι η ακόλουθη:187912

Αποστολή σχολίων

 

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