μέθοδος api τι. Απλή εξήγηση για αρχάριους. Τι είναι το API

Αυτό το σύντομο χρονικό διάστημα είναι γνωστό σε όλους όσους έχουν αντιμετωπίσει με κάποιο τρόπο την ανάπτυξη. Αλλά δεν καταλαβαίνουν όλοι τι ακριβώς σημαίνει και γιατί χρειάζεται. Προγραμματιστής Πιοτρ Γκαζάροφμίλησε για το API με απλά λόγια στο blog του.

Η συντομογραφία API σημαίνει "Application Programming Interface" (διεπαφή προγραμματισμού εφαρμογών, διεπαφή προγραμματισμού εφαρμογών). Οι περισσότερες μεγάλες εταιρείες σε κάποιο στάδιο αναπτύσσουν API για πελάτες ή για εσωτερική χρήση. Για να κατανοήσετε πώς και πώς χρησιμοποιείται το API στην ανάπτυξη και τις επιχειρήσεις, πρέπει πρώτα να κατανοήσετε πώς λειτουργεί ο Παγκόσμιος Ιστός.

World Wide Web και απομακρυσμένοι διακομιστές

Το WWW μπορεί να θεωρηθεί ως ένα τεράστιο δίκτυο συνδεδεμένων διακομιστών που αποθηκεύουν κάθε σελίδα. Ένας συνηθισμένος φορητός υπολογιστής μπορεί να μετατραπεί σε διακομιστή ικανό να εξυπηρετήσει έναν ολόκληρο ιστότοπο στο δίκτυο και οι προγραμματιστές χρησιμοποιούν τοπικούς διακομιστές για να δημιουργήσουν τοποθεσίες πριν τους ανοίξουν σε ένα ευρύ φάσμα χρηστών.

Όταν πληκτρολογείτε στη γραμμή διευθύνσεων ενός προγράμματος περιήγησης www.facebook.comένα αντίστοιχο αίτημα αποστέλλεται στον απομακρυσμένο διακομιστή Facebook. Μόλις το πρόγραμμα περιήγησης λάβει την απάντηση, ερμηνεύει τον κώδικα και αποδίδει τη σελίδα.

Κάθε φορά που ένας χρήστης επισκέπτεται μια σελίδα στον ιστό, αλληλεπιδρά με το API του απομακρυσμένου διακομιστή. Το API είναι το τμήμα του διακομιστή που λαμβάνει αιτήματα και στέλνει απαντήσεις.

API ως τρόπος εξυπηρέτησης πελατών

Πολλές εταιρείες προσφέρουν το API ως τελικό προϊόν. Για παράδειγμα, το Weather Underground πουλάει πρόσβαση στο API δεδομένων καιρού του.

Σενάριο χρήσης:στον ιστότοπο μιας μικρής εταιρείας υπάρχει μια φόρμα για να κλείσετε ραντεβού για πελάτες. Η εταιρεία θέλει να ενσωματώσει το Ημερολόγιο Google σε αυτό για να δώσει στους πελάτες τη δυνατότητα να δημιουργούν αυτόματα μια εκδήλωση και να συμπληρώνουν τις λεπτομέρειες μιας επερχόμενης συνάντησης.

Εφαρμογή API:στόχος - ο διακομιστής του ιστότοπου θα πρέπει να επικοινωνήσει απευθείας με τον διακομιστή Google με αίτημα να δημιουργήσει ένα συμβάν με τις καθορισμένες λεπτομέρειες, να λάβει απάντηση από την Google, να την επεξεργαστεί και να διαβιβάσει τις κατάλληλες πληροφορίες στο πρόγραμμα περιήγησης, για παράδειγμα, ένα μήνυμα επιβεβαίωσης στον χρήστη .

Εναλλακτικά, το πρόγραμμα περιήγησης μπορεί να υποβάλει αίτημα στο API διακομιστή της Google, παρακάμπτοντας τον διακομιστή της εταιρείας.

Από το API Ημερολόγιο Googleδιαφορετικό από το API οποιουδήποτε άλλου απομακρυσμένου διακομιστή στο δίκτυο;

Τεχνικά, η διαφορά είναι στη μορφή αίτησης και απάντησης. Για τη δημιουργία μιας ολοκληρωμένης ιστοσελίδας, το πρόγραμμα περιήγησης αναμένει απάντηση σε γλώσσα σήμανσης HTML, ενώ το API Ημερολογίου Google θα επιστρέψει μόνο δεδομένα σε μορφή όπως το JSON.

Εάν το αίτημα στο API γίνεται από τον διακομιστή του ιστότοπου της εταιρείας, τότε είναι ο πελάτης (όπως ακριβώς ο πελάτης είναι ο browser όταν ο χρήστης ανοίγει τον ιστότοπο).

Χάρη στο API, ο χρήστης έχει την ευκαιρία να εκτελέσει μια ενέργεια χωρίς να φύγει από τον ιστότοπο της εταιρείας.

Οι περισσότεροι σύγχρονοι ιστότοποι χρησιμοποιούν τουλάχιστον μερικά API τρίτων. Πολλές εργασίες έχουν ήδη έτοιμες λύσεις που προσφέρονται από τρίτους προγραμματιστές, είτε πρόκειται για βιβλιοθήκη είτε για υπηρεσία. Συχνά είναι ευκολότερο και πιο αξιόπιστο να καταφύγεις σε μια έτοιμη λύση.

Πολλοί προγραμματιστές διανέμουν την εφαρμογή σε πολλούς διακομιστές που αλληλεπιδρούν μεταξύ τους χρησιμοποιώντας το API. Οι διακομιστές που εκτελούν μια βοηθητική λειτουργία σε σχέση με τον κύριο διακομιστή εφαρμογών ονομάζονται microservices.

Έτσι, όταν μια εταιρεία προσφέρει στους χρήστες της ένα API, σημαίνει απλώς ότι έχει δημιουργήσει έναν αριθμό από ειδικές διευθύνσεις URL, τα οποία επιστρέφουν μόνο δεδομένα ως απάντηση.

Τέτοια αιτήματα μπορούν συχνά να σταλούν μέσω του προγράμματος περιήγησης. Δεδομένου ότι η μετάδοση δεδομένων μέσω του πρωτοκόλλου HTTP πραγματοποιείται σε μορφή κειμένου, το πρόγραμμα περιήγησης θα μπορεί πάντα να εμφανίζει την απάντηση. Για παράδειγμα, μέσω ενός προγράμματος περιήγησης, μπορείτε να αποκτήσετε απευθείας πρόσβαση στο GitHub API (https://api.github.com/users/petrgazarov) και χωρίς διακριτικό πρόσβασης και να λάβετε την ακόλουθη απάντηση σε μορφή JSON:

Το πρόγραμμα περιήγησης εμφανίζει τέλεια μια απάντηση JSON, η οποία μπορεί να εισαχθεί στον κώδικα. Αρκεί απλώς να εξαγάγετε δεδομένα από τέτοιο κείμενο για να τα χρησιμοποιήσετε κατά την κρίση σας.

Μερικά ακόμη παραδείγματα API

Η λέξη "εφαρμογή" (εφαρμοσμένη, εφαρμογή) μπορεί να χρησιμοποιηθεί με διαφορετικές έννοιες. Στο πλαίσιο του API, σημαίνει:

  • θραύσμα λογισμικόμε συγκεκριμένη λειτουργία
  • ο διακομιστής ως σύνολο, η εφαρμογή στο σύνολό της ή απλώς ένα ξεχωριστό μέρος της εφαρμογής.

Οποιοδήποτε κομμάτι λογισμικού που μπορεί να διακριθεί σαφώς από το περιβάλλον μπορεί να αντικαταστήσει το γράμμα "A" στην αγγλική συντομογραφία και μπορεί επίσης να έχει κάποιο είδος API. Για παράδειγμα, όταν ένας προγραμματιστής εφαρμόζει μια βιβλιοθήκη τρίτου μέρους στον κώδικα, αυτός γίνεται μέρος ολόκληρης της εφαρμογής. Ως ξεχωριστό κομμάτι λογισμικού, η βιβλιοθήκη θα έχει κάποιο είδος API που θα της επιτρέπει να αλληλεπιδρά με τον υπόλοιπο κώδικα εφαρμογής.

Στον αντικειμενοστραφή σχεδιασμό, ο κώδικας αναπαρίσταται ως μια συλλογή αντικειμένων. Μπορεί να υπάρχουν εκατοντάδες τέτοια αντικείμενα που αλληλεπιδρούν μεταξύ τους σε μια εφαρμογή. Κάθε ένα από αυτά έχει το δικό του API - ένα σύνολο δημόσιοιδιότητες και μεθόδους αλληλεπίδρασης με άλλα αντικείμενα στην εφαρμογή. Τα αντικείμενα μπορεί επίσης να έχουν ιδιωτικός, εσωτερική λογική που είναι κρυμμένη από το περιβάλλον και δεν είναι API.

Τα API μπορεί να είναι διασκεδαστικά και απογοητευτικά ταυτόχρονα. Από τη μία πλευρά, αλληλεπιδρώντας με άλλες εφαρμογές, μπορείτε να αυξήσετε σημαντικά την προσέγγιση του κοινού και το «wow effect» της εφαρμογής σας. Από την άλλη πλευρά, αυτό περιλαμβάνει την ανάγνωση πολλών τεκμηρίωσης, την εκμάθηση για στρατηγικές ελέγχου ταυτότητας και την ανάλυση μη ενημερωτικών (ή ακόμα και ελλειπόντων) μηνυμάτων σφάλματος.

Πρώτα απ 'όλα, εάν εξακολουθείτε να μην καταλαβαίνετε πλήρως τι είναι το API (Application Programming Interface), διαβάστε την εξήγηση του Skillcrush και, στη συνέχεια, το πρώτο μέρος αυτού του άρθρου για να καλύψετε τη διαφορά.

Το "API" είναι μια απίστευτα ευρεία έννοια - κάθε φορά που η εφαρμογή σας "μιλάει" με άλλη εφαρμογή, γίνεται μέσω κάποιου είδους API. Τα στοιχεία της δικής σας εφαρμογής, όπως διαφορετικά μέρη του Rails, επικοινωνούν επίσης μεταξύ τους μέσω ενός API. Είναι λίγο πολύ ανεξάρτητες υπο-εφαρμογές που μεταβιβάζουν τα δεδομένα που χρειάζονται για να εκτελέσουν τις δικές τους συγκεκριμένες εργασίες. Στον κόσμο των εφαρμογών, όλα είναι ένα API!

Όταν δημιουργείτε εφαρμογές με πιο δυναμική λειτουργικότητα στο front-end (τόσο εφαρμογές Javascript μιας σελίδας όσο και απλές εφαρμογές με ξεχωριστές κλήσεις AJAX), θα επικοινωνούν με το backend του Rails μέσω του δικού σας API, το οποίο είναι στην πραγματικότητα απλώς μια ή δύο επιπλέον γραμμές κώδικα . , λέγοντας στους ελεγκτές σας πώς να προβάλλουν JSON ή XML αντί για HTML.

Σε αυτό το σεμινάριο, θα μάθετε πώς να δημιουργείτε το δικό σας API. Στα επόμενα μαθήματα, θα καλύψουμε τον τρόπο αλληλεπίδρασης με τα API άλλων εφαρμογών. Τα μαθήματα θα πρέπει να είναι ένα καλό εφαλτήριο για την εκμάθηση αυτού του θέματος, αλλά είναι απίθανο να μπορέσουν να καλύψουν πλήρως όλες τις περιπτώσεις. Ένα μεγάλο μέρος της εργασίας με τα API είναι να μπορείτε να διαβάσετε την τεκμηρίωσή τους και να καταλάβετε τι θέλουν από εσάς.

Σημεία για προβληματισμό

Ελέγξτε τις ερωτήσεις και δείτε αν γνωρίζετε τις απαντήσεις. Ελέγξτε ξανά τον εαυτό σας αφού ολοκληρώσετε την εργασία.

  • Πώς η Rails κατανοεί τον τύπο αρχείου που περιμένετε ως απόκριση όταν στέλνετε ένα αίτημα HTTP.
  • Ποιος είναι ο σκοπός της μεθόδου #respond_to;
  • Πώς επιστρέφετε ένα αντικείμενο χρήστη (User) ενώ προσδιορίζετε χαρακτηριστικά που δεν θέλετε να περιλαμβάνονται σε αυτό το αντικείμενο (δηλαδή δεν μπορείτε απλώς να επιστρέψετε User.first);
  • Ονομάστε 2 βήματα στα παρασκήνια της μεθόδου #to_json.
  • Πώς μπορώ να πω σε μια ενέργεια ελεγκτή να αποδίδει μόνο ένα μήνυμα σφάλματος;
  • Πώς να δημιουργήσετε το δικό σας μήνυμα σφάλματος;
  • Γιατί δεν μπορείτε να χρησιμοποιήσετε μεθόδους ελέγχου ταυτότητας ελεγκτή που βασίζονται σε περιόδους σύνδεσης, εάν θέλετε να επιτρέψετε τη σύνδεση μέσω προγραμματισμού στο API σας;
  • Τι είναι η «Αρχιτεκτονική με προσανατολισμό στις υπηρεσίες»;

Βασικά API

Η εφαρμογή Rails σας είναι στην πραγματικότητα ήδη ένα API, αν και μπορεί να μην το σκεφτείτε ως API. Το πρόγραμμα περιήγησης ιστού που εκκινούν οι χρήστες σας είναι επίσης ένα πρόγραμμα, επομένως στέλνει στην πραγματικότητα ένα αίτημα API στην εφαρμογή Rails όταν ο χρήστης ανοίγει μια νέα σελίδα. Τείνουμε να σκεφτόμαστε με αυτόν τον τρόπο, επειδή η απόδοση προτύπων HTML είναι μια τόσο συνηθισμένη εργασία που απλώς κωδικοποιούμε αυτή τη λειτουργία στα προγράμματα διακομιστή μας ως τυπικό τύπο απόκρισης και θεωρούμε οτιδήποτε άλλο είναι κάτι ασυνήθιστο.

Ωστόσο, συχνά θέλετε να υποβάλετε ένα αίτημα που δεν απαιτεί να περάσετε από όλους τους πονοκεφάλους της χρήσης ενός προγράμματος περιήγησης. Μπορεί να μην σας ενδιαφέρει η δομή της σελίδας (HTML), αλλά σε αντάλλαγμα θέλετε καθαρά δεδομένα. Ας υποθέσουμε ότι θέλετε να λάβετε μια λίστα με όλους τους χρήστες. Μπορείτε να ζητήσετε κάτι σαν το http://yourapplication.com/users , το οποίο πιθανότατα θα ενεργοποιήσει την ενέργεια #index και θα αποδώσει μια λίστα με όλους τους χρήστες της εφαρμογής.

Αλλά γιατί να ασχοληθείτε με όλες αυτές τις επιπλέον πληροφορίες όταν το μόνο που θέλετε είναι μια λίστα χρηστών; Η απλούστερη επιλογή θα ήταν να στείλετε ένα αίτημα στην ίδια διεύθυνση URL, προσδιορίζοντας την προσδοκία μιας απάντησης JSON ή XML ως αντάλλαγμα. Εάν ρυθμίσετε σωστά τον ελεγκτή Rails, θα λάβετε πίσω ένα απλό αντικείμενο πίνακα JSON που περιέχει όλους τους χρήστες. Εκπληκτικός!

Η ίδια αρχή ισχύει όταν επικοινωνείτε με ένα εξωτερικό API. Ας υποθέσουμε ότι θέλετε να λαμβάνετε τα πρόσφατα "tweets" ενός χρήστη από το Twitter. Το μόνο που χρειάζεται να κάνετε είναι να πείτε στην εφαρμογή Rails πώς να αλληλεπιδρά με το API του Twitter (δηλαδή να επαληθεύσετε τον εαυτό σας), να υποβάλετε το αίτημα και να επεξεργαστείτε το σύνολο των "tweet" που θα επιστραφούν.

Δημιουργία API

Μπορεί να θέλετε να κάνετε την εφαρμογή σας Rails ένα καθαρό back-end API για ιστοσελίδες διεπαφής ή απλώς να θέλετε να μάθετε πώς να στέλνετε JSON όταν το ζητήσει η διεπαφή. Αυτή η ενότητα δεν θα καλύψει τον τρόπο δημιουργίας πλήρους RESTful API με λειτουργικότητα ελέγχου ταυτότητας. Αυτή είναι μια ομαλή εισαγωγή στη διαχείριση της εφαρμογής σας ως API.

Βασικά

Εάν θέλετε η εφαρμογή Rails να επιστρέφει JSON αντί για HTML, θα πρέπει να ενημερώσετε τον ελεγκτή σας να το κάνει. Το υπέροχο είναι ότι η ίδια ενέργεια ελεγκτή μπορεί να επιστρέψει διαφορετικούς τύπους ανάλογα με το αν ο χρήστης σας κάνει ένα κανονικό αίτημα προγράμματος περιήγησης ή έχει πρόσβαση σε ένα API μέσω της γραμμής εντολών. Αυτό καθορίζει τον τύπο αιτήματος που υποβλήθηκε με βάση την επέκταση του ζητούμενου αρχείου, όπως example.xml ή example.json .

Μπορείτε να ελέγξετε τι «σκέφτεται» η Rails για τον τύπο του αρχείου που περιμένετε ελέγχοντας το αρχείο καταγραφής διακομιστή:

Ξεκίνησε GET "/posts/new" για 127.0.0.1 στις 2013-12-02 15:21:08 -0800 Επεξεργασία από PostsController#new ως HTML

Η πρώτη γραμμή σας λέει ποια διεύθυνση URL ζητήθηκε και η δεύτερη σας λέει πού κατευθύνθηκε και πώς τη χειρίζεται η Rails. Αν χρησιμοποιούσατε την επέκταση .json θα έμοιαζε με αυτό:

Ξεκίνησε GET "/posts.json" για 127.0.0.1 στις 2013-12-04 12:02:01 -0800 Επεξεργασία από PostsController#index ως JSON

Εάν εκτελείται μια δοκιμαστική εφαρμογή, δοκιμάστε να ζητήσετε διαφορετικές διευθύνσεις URL. Εάν ο ελεγκτής σας δεν ξέρει πώς να τα χειριστεί, τότε μπορεί να εμφανιστεί ένα σφάλμα, αλλά θα πρέπει να μπορείτε να δείτε τι κατανοεί η Rails από τα αιτήματά σας.

Απόδοση JSON ή XML

Όταν αποφασίσετε ότι θέλετε να απαντήσετε με JSON ή XML, θα πρέπει να πείτε στον ελεγκτή σας να αποδώσει JSON ή XML αντί για HTML. Ένας τρόπος για να το κάνετε αυτό είναι να χρησιμοποιήσετε τη μέθοδο #respond_to:

Class UsersController< ApplicationController def index @users = User.all respond_to do |format| format.html # index.html.erb format.xml { render xml: @users } format.json { render json: @users } end end end

Σε αυτήν την περίπτωση, το #respond_to μεταβιβάζει ένα αντικείμενο μορφής στο μπλοκ στο οποίο μπορείτε να επισυνάψετε την κατάλληλη κλήση απόδοσης. Εάν δεν κάνετε τίποτα, το html θα αποδοθεί χρησιμοποιώντας το τυπικό πρότυπο Rails (app/views/index.html.erb σε αυτό το παράδειγμα).

Η συνάρτηση #render είναι αρκετά έξυπνη ώστε να κατανοεί πώς να αποδίδει μια μεγάλη ποικιλία μορφών. Όταν του περάσετε το κλειδί:json , θα καλέσει το #to_json στην τιμή, σε αυτό το παράδειγμα @users . Αυτό θα μετατρέψει τα αντικείμενα Ruby σας σε συμβολοσειρές JSON, οι οποίες θα περάσουν στην αίτηση αίτησης.

Αυτός είναι ο τρόπος με τον οποίο λαμβάνετε το API σας. Φυσικά, η δημιουργία ενός API μπορεί να είναι λίγο πιο περίπλοκη αν θέλετε να κάνετε κάποια φανταχτερά πράγματα, αλλά όλα έχουν να κάνουν με τα βασικά.

Καθορισμός χαρακτηριστικών επιστροφής

Ας υποθέσουμε ότι θέλετε να βεβαιωθείτε ότι δεν θα επιστρέψετε τη διεύθυνση email ενός χρήστη μαζί με ένα αντικείμενο χρήστη. Σε αυτήν την περίπτωση, θα θέλετε να αλλάξετε τα χαρακτηριστικά που θα επιστραφούν, τροποποιώντας τη λειτουργία της μεθόδου #to_json.

Προηγουμένως, απλώς θα είχατε παρακάμψει τη μέθοδο #to_json με την έκδοσή σας, αλλά τώρα δεν χρειάζεται - στην πραγματικότητα, αντικαθιστάτε τη μέθοδο #as_json. Η μέθοδος #as_json χρησιμοποιείται στη μέθοδο #to_json, επομένως η τροποποίησή της αλλάζει σιωπηρά το αποτέλεσμα #to_json , αλλά με έναν μάλλον συγκεκριμένο τρόπο.

Το #to_json κάνει 2 πράγματα: εκτελεί το #as_json και λαμβάνει έναν κατακερματισμό των χαρακτηριστικών που θα αποδοθούν στο JSON. Στη συνέχεια αποδίδεται σε JSON χρησιμοποιώντας το ActiveSupport::json.encode . Έτσι, τροποποιώντας το #as_json , είστε πιο συγκεκριμένοι σχετικά με το τμήμα της μεθόδου #to_json που θέλετε πραγματικά να αλλάξετε.

Στην περίπτωσή μας, το κάνουμε αυτό τροποποιώντας το #as_json στο μοντέλο μας για να επιστρέφουμε μόνο τα χαρακτηριστικά που χρειαζόμαστε:

# app/models/user.rb class Χρήστης< ActiveRecord::Base # Вариант 1: Полное переопределение метода #as_json def as_json(options={}) { :name =>self.name ) # ΜΗΝ συμπεριλάβετε το τέλος του πεδίου email # Επιλογή 2: Χρησιμοποιήστε την τυπική μέθοδο #as_json def as_json(options=()) super(only: [:name]) end end

Στη συνέχεια, στον ελεγκτή μας, το μόνο που χρειάζεται να κάνουμε είναι να αποδώσουμε το JSON ως κανονικό (το παρακάτω παράδειγμα θα επιστρέφει πάντα το JSON, είτε έχει σταλεί αίτημα HTML είτε όχι):

# app/controllers/users_controller.rb class UsersController< ApplicationController def index render json: User.all end end

Σημειώστε ότι δεν χρειάζεται να καλέσετε μόνοι σας το #to_json όταν χρησιμοποιείτε το #render - θα το κάνει για εσάς.

Μερικές φορές το Heroku μπορεί να απαιτεί πρόσθετα βήματα για να εμφανίσει σωστά τις σελίδες σφαλμάτων σας. Κοίτα. Ίσως χρειαστεί να αφαιρέσετε πρώτα στατικές σελίδες από τον κατάλογο εφαρμογής/δημόσιο.

Ασφάλιση από έξω

Ας υποθέσουμε ότι θέλετε να επιτρέψετε την πρόσβαση στο API μόνο εάν ο χρήστης είναι συνδεδεμένος. Ο υπάρχων έλεγχος ταυτότητας ελεγκτή σας κάνει ήδη τη δουλειά - απλώς βεβαιωθείτε ότι έχετε το σωστό σύνολο #before_action (π.χ. before_action:require_login). Μπορεί να θέλετε λειτουργικότητα όπου τόσο οι συνδεδεμένοι όσο και οι μη συνδεδεμένοι χρήστες μπορούν να δουν τη σελίδα, αλλά ο καθένας πρέπει να βλέπει διαφορετικά δεδομένα. Δεν θέλετε οι μη συνδεδεμένοι χρήστες να μπορούν να υποβάλλουν αιτήματα API για την ανάκτηση ευαίσθητων δεδομένων. Ομοίως, δεν θέλετε να επιτρέπετε σε μη εξουσιοδοτημένους χρήστες να επισκέπτονται ορισμένες σελίδες HTML.

Εάν θέλετε να επεξεργάζεστε αιτήματα από μια εφαρμογή που δεν είναι πρόγραμμα περιήγησης (για παράδειγμα, από τη γραμμή εντολών), δεν μπορείτε να βασιστείτε στα cookie του προγράμματος περιήγησης για έλεγχο ταυτότητας. Αυτός είναι ο λόγος για τον οποίο τα περισσότερα API χρησιμοποιούν εγγενή διακριτικά ως μέρος της διαδικασίας ελέγχου ταυτότητας. Θα μιλήσουμε λίγο περισσότερο για τα token στο επόμενο μάθημα.

Επόμενα βήματα

Τώρα έχετε τις δεξιότητες να χρησιμοποιήσετε την εφαρμογή Rails για να εξυπηρετήσετε όχι μόνο HTML, αλλά οποιαδήποτε άλλη μορφή. Αν θέλετε να προχωρήσετε παραπέρα και να αφήσετε άλλους προγραμματιστές να δημιουργήσουν πράγματα χρησιμοποιώντας την πλατφόρμα σας (για παράδειγμα, ώστε να μπορούν να κάνουν αιτήματα μέσω προγραμματισμού αντί να ελέγχουν ταυτότητα ως χρήστης), θα πρέπει να κάνετε το σύστημα API σας πολύ πιο ασφαλές. Δεν θα τα καλύψουμε όλα εδώ, αλλά δείτε τα παρακάτω:

  • Το άρθρο Building Awesome Rails APIs περιγράφει πολλές από τις καλύτερες προσεγγίσεις για τη μετάβαση από μια εφαρμογή παιχνιδιών σε βιομηχανικά τυπικά API.

Αρχιτεκτονική Προσανατολισμού Υπηρεσιών

Ήρθε η ώρα να εισαγάγουμε μια αρχιτεκτονική προσέγγιση που ονομάζεται Service-Oriented Architecture (SOA). Η βασική ιδέα είναι ότι η αίτησή σας θα αποτελείται από πολλές υπηρεσίες, όπως σύστημα πληρωμών, εγγραφή χρήστη, ενότητα συστάσεων κ.λπ. Αντί να τα χτίσετε όλα μέσα σε μια κύρια εφαρμογή, χωρίζετε τα υποσυστήματα σε εντελώς ανεξάρτητα κομμάτια που αλληλεπιδρούν μεταξύ τους χρησιμοποιώντας εσωτερικά API.

Αυτό είναι καλό για πολλούς λόγους. Διασφαλίζοντας ότι κάθε κομμάτι της εφαρμογής σας δεν ενδιαφέρεται για το πώς λειτουργούν τα άλλα μέρη και γνωρίζει μόνο πώς να ζητά δεδομένα μέσω του API τους, μπορείτε να κάνετε σημαντικές αλλαγές στον κωδικό υπηρεσίας και η υπόλοιπη εφαρμογή θα λειτουργεί όπως πριν. Μπορείτε να αντικαταστήσετε πλήρως μια υπηρεσία με μια άλλη και εφόσον επικοινωνεί χρησιμοποιώντας τις ίδιες μεθόδους API, θα πηγαίνει πολύ ομαλά. Μπορείτε να χρησιμοποιήσετε εξωτερικά API ως μέρος της εφαρμογής σας (όπως επεξεργαστές πληρωμών) αντί να γράψετε τα δικά σας. Μπορείτε να δημιουργήσετε μια εφαρμογή PHP που αλληλεπιδρά με μια εφαρμογή Python που αλληλεπιδρά με μια εφαρμογή Rails και όλα θα λειτουργήσουν, επειδή επικοινωνούν μεταξύ τους χρησιμοποιώντας το API.

Κατά γενικό κανόνα, προσπαθήστε να διατηρήσετε κάθε μέρος της αίτησής σας όσο το δυνατόν πιο ανεξάρτητο - μια καλή ιδέα. Η ιδέα του SOA σας ενθαρρύνει να σκεφτείτε με όρους ακριβώς ποιες μεθόδους θέλετε να εκθέσετε σε άλλα μέρη της εφαρμογής σας και θα κάνει τον κώδικά σας καλύτερο στην πορεία. Επιπλέον, υποθέτοντας ότι κάθε κύριο στοιχείο της εφαρμογής σας είναι ανεξάρτητο, μπορείτε επίσης να απομονώσετε προβλήματα πολύ πιο εύκολα και να χειριστείτε τα σφάλματα πιο έξυπνα.

Η χρήση μιας αρχιτεκτονικής προσανατολισμένης στις υπηρεσίες για μια ολόκληρη εφαρμογή είναι σαν να αναλύεις ένα γιγάντιο, πολύπλοκο σενάριο Ruby σε εξαιρετικές κλάσεις και μεθόδους, μόνο σε μεγαλύτερη κλίμακα.

Μία από τις πιο διάσημες περιπτώσεις μετάβασης σε αρχιτεκτονική προσανατολισμένη στις υπηρεσίες είναι η Amazon.com. Μια μέρα το 2002, ο Τζεφ Μπέζος δήλωσε ωμά ότι όλες οι ομάδες εργασίας πρέπει να μετακομίσουν στο SOA ή να απολυθούν. Διαβόητος ανάρτησηένας υπάλληλος της Google, που προοριζόταν για εσωτερικούς σκοπούς αλλά εκτέθηκε κατά λάθος στο κοινό, μίλησε για τη δύναμη της Amazon χρησιμοποιώντας το SOA. Αυτό είναι μια εξαιρετική ανάγνωση, οπότε φροντίστε να το αξιολογήσετε, αλλά οι κύριες θέσεις της επιστολής του Μπέζος βγαίνουν στα ακόλουθα αποσπάσματα από την ανάρτηση:

1) Όλες οι εντολές παρέχουν πλέον τα δεδομένα και τη λειτουργικότητά τους μέσω διεπαφών υπηρεσιών.

2) Οι ομάδες πρέπει να επικοινωνούν μεταξύ τους μέσω αυτών των διεπαφών.

3) Άλλες μορφές επικοινωνίας μεταξύ των διεργασιών απαγορεύονται: όχι άμεσες συνδέσεις, καμία άμεση ανάγνωση δεδομένων από άλλη εντολή, κανένα κοινόχρηστο μοντέλο μνήμης, κανένα "backdoors" και παρόμοια. Ο μόνος επιτρεπόμενος τρόπος επικοινωνίας είναι η πρόσβαση στη διεπαφή υπηρεσίας μέσω του δικτύου.

4) Δεν έχει σημασία τι τεχνολογία χρησιμοποιούν. HTTP, Corba, Pubsub, εγγενή πρωτόκολλα - δεν έχει σημασία. Ο Μπέζος δεν τον νοιάζει.

5) Όλες οι διεπαφές υπηρεσιών, ανεξαιρέτως, πρέπει να έχουν σχεδιαστεί αρχικά με δυνατότητα ελέγχου από έξω. Δηλαδή, η ομάδα πρέπει να σχεδιάζει και να σχεδιάζει για να μπορεί να παρέχει μια διεπαφή σε προγραμματιστές εκτός εταιρείας. Χωρίς εξαιρέσεις.

6) Όποιος αγνοεί αυτές τις απαιτήσεις θα απολυθεί.

Το SOA είναι σοβαρή υπόθεση. Σίγουρα, υπάρχουν πολλά προβλήματα που προκύπτουν κατά τη χρήση του - ρίξτε μια ματιά σε αυτήν την ανάρτηση στα "μαθήματα" της Amazon - αλλά έχει απίστευτα οφέλη.

Πιθανότατα δεν θα ανησυχείτε πολύ για το SOA ενώ δημιουργείτε εφαρμογές «παιχνιδιών» για τον εαυτό σας, αλλά αυτή η ερώτηση σίγουρα θα προκύψει όταν ξεκινήσετε να εργάζεστε σε μια εταιρεία πληροφορικής, επομένως η γνώση του είναι καλή πρακτική.

ο στόχος σου

  1. Διαβάστε την Ενότητα 7 του Οδηγού Rails για ελεγκτές για να μάθετε σχετικά με την απόδοση JSON και XML.
  2. Δεν απαιτείται η προβολή τους (επειδή προχωρούν λίγο περισσότερο από ό,τι έχουμε αυτήν τη στιγμή), αλλά αν σας ενδιαφέρει, ρίξτε μια ματιά στο Railscasts στην ενότητα Πρόσθετοι πόροι στο κάτω μέρος του σεμιναρίου για να μάθετε περισσότερα σχετικά με τα οφέλη του API.

συμπέρασμα

Θα συνεργαστούμε πιο στενά με την εφαρμογή σας ως API κατά τη διάρκεια του μαθήματος Javascript. Σε αυτό το μάθημα, θα δημιουργήσετε πολλές εφαρμογές πλήρους στοίβας που χρησιμοποιούν κλήσεις AJAX για καλύτερη εμπειρία χρήστη, η οποία στην πραγματικότητα περιλαμβάνει την απόδοση δεδομένων XML ή JSON αντί για μια πλήρη σελίδα HTML. Στη συνέχεια, θα δημιουργήσετε πολλές εφαρμογές Javascript μιας σελίδας που βασίζονται στο API που παρέχεται από την εφαρμογή Rails για να λάβουν όλα τα δεδομένα που χρειάζονται από τη βάση δεδομένων και διαφορετικά θα εκτελούνται από την πλευρά του πελάτη (στο πρόγραμμα περιήγησης).

Ο καλύτερος τρόπος για να αντιμετωπίσετε ένα API είναι να δημιουργήσετε και να αλληλεπιδράσετε με αυτό, στο οποίο θα επικεντρωθούμε στα έργα μας.

Windows API - ένα σύνολο λειτουργιών του λειτουργικού συστήματος

Η συντομογραφία API φαίνεται σε πολλούς αρχάριους προγραμματιστές πολύ μυστηριώδης και τρομακτική. Στην πραγματικότητα, το Application Programming Interface (API) είναι μόνο ένα έτοιμο σύνολο λειτουργιών που μπορούν να χρησιμοποιήσουν οι προγραμματιστές εφαρμογών. Γενικά, αυτή η έννοια είναι ισοδύναμη με αυτό που ονομαζόταν πιο συχνά βιβλιοθήκη υπορουτίνων. Ωστόσο, το API συνήθως νοείται ως μια ειδική κατηγορία τέτοιων βιβλιοθηκών.

Κατά την ανάπτυξη σχεδόν κάθε μάλλον πολύπλοκης εφαρμογής (MyApplication), σχηματίζεται ένα σύνολο συγκεκριμένων εσωτερικών λειτουργιών για τον τελικό χρήστη, το οποίο χρησιμοποιείται για την υλοποίηση αυτού του συγκεκριμένου προγράμματος, το οποίο ονομάζεται MyApplication API. Ωστόσο, συχνά αποδεικνύεται ότι αυτές οι λειτουργίες μπορούν να χρησιμοποιηθούν αποτελεσματικά για τη δημιουργία άλλων εφαρμογών, συμπεριλαμβανομένων άλλων προγραμματιστών. Σε αυτήν την περίπτωση, οι συγγραφείς, βάσει της στρατηγικής προώθησης του προϊόντος τους, πρέπει να αποφασίσουν εάν ανοίγουν πρόσβαση σε αυτό το σύνολο για εξωτερικούς χρήστες ή όχι; Εάν η απάντηση είναι ναι, στην περιγραφή του πακέτου λογισμικού, η φράση εμφανίζεται ως θετικό χαρακτηριστικό: "Το πακέτο περιλαμβάνει ένα ανοιχτό σύνολο λειτουργιών API" (αλλά μερικές φορές για επιπλέον χρήματα).

Έτσι, τις περισσότερες φορές, ένα API αναφέρεται σε ένα σύνολο λειτουργιών που αποτελούν μέρος μιας εφαρμογής, αλλά ταυτόχρονα είναι διαθέσιμες για χρήση σε άλλα προγράμματα. Για παράδειγμα, το Excel, εκτός από τη διεπαφή για τον τελικό χρήστη, διαθέτει ένα σύνολο συναρτήσεων API του Excel που μπορούν να χρησιμοποιηθούν, ειδικότερα, κατά τη δημιουργία εφαρμογών με χρήση VB.

Αντίστοιχα, το API των Windows είναι ένα σύνολο λειτουργιών που αποτελεί μέρος του ίδιου του λειτουργικού συστήματος και ταυτόχρονα είναι διαθέσιμο σε οποιαδήποτε άλλη εφαρμογή, συμπεριλαμβανομένων εκείνων που έχουν γραφτεί με χρήση VB. Από αυτή την άποψη, η αναλογία με το σετ διακοπής συστήματος BIOS/DOS, που είναι στην πραγματικότητα ένα API DOS, είναι αρκετά δικαιολογημένη.

Η διαφορά έγκειται στο γεγονός ότι η σύνθεση των λειτουργιών API των Windows, αφενός, είναι πολύ ευρύτερη από ό,τι στο DOS, αφετέρου, δεν περιλαμβάνει πολλά από τα εργαλεία για την άμεση διαχείριση των πόρων του υπολογιστή που ήταν διαθέσιμα σε προγραμματιστές στο προηγούμενο λειτουργικό σύστημα. Επιπλέον, η πρόσβαση στο API των Windows πραγματοποιείται με τη χρήση συνηθισμένων διαδικαστικών κλήσεων και οι λειτουργίες DOS καλούνται μέσω μιας ειδικής εντολής μηχανής του επεξεργαστή, η οποία ονομάζεται Διακοπή ("διακοπή").

Γιατί χρειάζεστε το Win API για προγραμματιστές VB

Παρά το γεγονός ότι η VB έχει μια τεράστια ποικιλία λειτουργιών, στη διαδικασία περισσότερο ή λιγότερο σοβαρής ανάπτυξης, αποδεικνύεται ότι οι δυνατότητές τους συχνά δεν επαρκούν για την επίλυση των απαραίτητων εργασιών. Ταυτόχρονα, οι αρχάριοι προγραμματιστές συχνά αρχίζουν να παραπονιούνται για τις ελλείψεις της VB και σκέφτονται να αλλάξουν εργαλεία, χωρίς να υποψιάζονται ότι ο υπολογιστής τους έχει ένα τεράστιο σύνολο εργαλείων και απλά πρέπει να ξέρετε πώς να τα χρησιμοποιήσετε.

Όταν εξοικειωθείτε με το Win API, αποδεικνύεται ότι πολλές ενσωματωμένες λειτουργίες VB δεν είναι παρά μια κλήση στις αντίστοιχες διαδικασίες συστήματος, αλλά υλοποιούνται μόνο με τη μορφή σύνταξης δεδομένη γλώσσα. Έχοντας αυτό υπόψη, η ανάγκη χρήσης του API καθορίζεται από τις ακόλουθες επιλογές:

  1. Συναρτήσεις API που υλοποιούνται πλήρως ως ενσωματωμένες συναρτήσεις VB. Ωστόσο, μερικές φορές σε αυτήν την περίπτωση είναι χρήσιμο να μεταβείτε στη χρήση του API, καθώς αυτό μερικές φορές μπορεί να βελτιώσει σημαντικά την απόδοση (ιδίως λόγω της απουσίας περιττών μετατροπών των παραμέτρων που έχουν περάσει).
  2. Οι ενσωματωμένες συναρτήσεις VB υλοποιούν μόνο μια ειδική περίπτωση της αντίστοιχης συνάρτησης API. Αυτή είναι μια αρκετά κοινή επιλογή. Για παράδειγμα, το CreateDirectory API είναι πιο ισχυρό από την ενσωματωμένη πρόταση VB MkDir.
  3. Ένας τεράστιος αριθμός λειτουργιών API δεν έχει καθόλου ανάλογα στην τρέχουσα έκδοση της γλώσσας VB. Για παράδειγμα, δεν μπορείτε να διαγράψετε έναν κατάλογο χρησιμοποιώντας VB - πρέπει να χρησιμοποιήσετε τη συνάρτηση DeleteDirectory για να το κάνετε αυτό.

Θα πρέπει επίσης να τονιστεί ότι ορισμένες λειτουργίες API (το μερίδιό τους στο Win API είναι πολύ μικρό) δεν μπορούν να κληθούν από προγράμματα VB λόγω ορισμένων γλωσσικών περιορισμών, για παράδειγμα, λόγω της έλλειψης δυνατότητας εργασίας με διευθύνσεις μνήμης. Αλλά σε ορισμένες περιπτώσεις, οι μη τετριμμένες τεχνικές προγραμματισμού μπορούν να βοηθήσουν (ιδίως στην περίπτωση των ίδιων διευθύνσεων).

Η προσωπική άποψη του συγγραφέα είναι ότι αντί να επεκταθεί από έκδοση σε έκδοση των ενσωματωμένων λειτουργιών της VB, θα πρέπει να δώσει μια καλή περιγραφή των πιο δημοφιλών λειτουργιών API. Ταυτόχρονα, θα ήθελα να συμβουλεύσω τους προγραμματιστές να μην περιμένουν μια νέα έκδοση του εργαλείου με προηγμένες δυνατότητες, αλλά να μελετήσουν προσεκτικά τη σύνθεση του υπάρχοντος Win API - είναι πιθανό ότι οι λειτουργίες που χρειάζεστε θα μπορούσαν να εφαρμοστούν ήδη στο την έκδοση του 1991 της VB 1.0.

Πώς να μάθετε το Win API

Αυτή δεν είναι τόσο εύκολη ερώτηση, δεδομένου ότι ο αριθμός των λειτουργιών Win32 API υπολογίζεται σε περίπου 10.000 (κανείς δεν γνωρίζει τον ακριβή αριθμό, ούτε καν η Microsoft).

Το VB (εκδόσεις 4-6) περιλαμβάνει ένα αρχείο με περιγραφή των δηλώσεων Win API - WIN32API.TXT (περισσότερα για τη χρήση του αργότερα). Αλλά, πρώτον, μπορεί να χρησιμοποιηθεί για τη λήψη πληροφοριών σχετικά με τον σκοπό μιας συγκεκριμένης συνάρτησης και τις παραμέτρους της μόνο από τα μνημονικά ονόματα που χρησιμοποιούνται και, δεύτερον, η λίστα των συναρτήσεων σε αυτό το αρχείο απέχει πολύ από το να είναι πλήρης. Κάποτε (πριν από επτά χρόνια) το VB 3.0 είχε ειδικά αρχεία βοήθειας που περιγράφουν τις λειτουργίες του Win16 API. Ωστόσο, ήδη στην έκδοση 4.0 αυτή η χρήσιμη πληροφορία με μια βολική διεπαφή έχει εξαφανιστεί.

Μπορείτε να βρείτε αναλυτικές πληροφορίες σχετικά με το Win32 API στη βοήθεια του Platform Software Development Kit, η οποία περιλαμβάνεται στα CD της βιβλιοθήκης MSDN που περιλαμβάνονται στην έκδοση VB 5.0 και 6.0 Enterprise Edition και Office 2000 Developer Edition. Ωστόσο, δεν είναι εύκολο να βρεις εκεί τις απαραίτητες πληροφορίες και να τις καταλάβεις. Για να μην αναφέρουμε το γεγονός ότι όλες οι περιγραφές εκεί δίνονται σε σχέση με τη γλώσσα C.

Ο παγκοσμίου φήμης οδηγός εκμάθησης προγραμματισμού API στο περιβάλλον VB είναι τα βιβλία του διάσημου Αμερικανού ειδικού Daniel Appleman. Η σειρά του Dan Appleman's Visual Basic Programmer's Guide to the Windows API (για Win16, Win32, ισχύει για διαφορετικές εκδόσεις VB) είναι ένα από τα μπεστ σέλερ για προγραμματιστές VB από το 1993. Το VB 5.0 Programmer's Guide to the Win32 API του Dan Appleman, που κυκλοφόρησε το 1997, μεταφέρθηκε στον συγγραφέα από τις ΗΠΑ από έναν φίλο που το βρήκε στο πρώτο βιβλιοπωλείο μιας μικρής επαρχιακής πόλης.

Αυτό το βιβλίο έχει περισσότερες από 1.500 σελίδες και περιλαμβάνει γενικές τεχνικές προγραμματισμού VB API, καθώς και περισσότερες από 900 λειτουργίες. Το συνοδευτικό CD-ROM περιέχει το πλήρες κείμενο του βιβλίου και όλα τα παραδείγματα προγραμματισμού, καθώς και μερικά επιπλέον κεφάλαια που δεν περιλαμβάνονται στην έντυπη έκδοση. Το 1999, ο Dan Appleman κυκλοφόρησε ένα νέο βιβλίο, το Win32 του Dan Appleman API Puzzle Book and Tutorial for Visual Basic Programmers, το οποίο περιλαμβάνει πληροφορίες για άλλες 7600 λειτουργίες (αν και όχι τόσο εκτεταμένες).

Win API και Dynamic Link Library (DLL)

Το σύνολο Win API υλοποιείται ως δυναμικά DLL. Επιπλέον, θα μιλήσουμε πραγματικά για την τεχνολογία χρήσης DLL στο περιβάλλον VB χρησιμοποιώντας το παράδειγμα βιβλιοθηκών που αποτελούν μέρος του Win API. Ωστόσο, όταν μιλάμε για DLL, υπάρχουν μερικά σημαντικά πράγματα που πρέπει να σημειώσετε.

Σε αυτήν την περίπτωση, με τον όρο DLL εννοούμε την παραδοσιακή παραλλαγή των δυαδικών δυναμικών βιβλιοθηκών, οι οποίες παρέχουν στις εφαρμογές άμεση πρόσβαση στις απαραίτητες διαδικασίες - υπορουτίνες ή συναρτήσεις (όπως συμβαίνει κατά την κλήση διαδικασιών μέσα σε ένα έργο VB). Τέτοιες βιβλιοθήκες μπορούν να δημιουργηθούν χρησιμοποιώντας διαφορετικά εργαλεία: VC ++, Delphi, Fortran, εκτός από το VB (θα δούμε τι θα εμφανιστεί στην έκδοση 7.0) - το τελευταίο μπορεί να δημιουργήσει μόνο ActiveX DLL, στα οποία η πρόσβαση γίνεται μέσω της διεπαφής OLE Automation.

Συνήθως, τα αρχεία βιβλιοθήκης δυναμικών συνδέσμων έχουν επέκταση .DLL, αλλά αυτό δεν είναι καθόλου απαραίτητο (για το Win16, η επέκταση .EXE χρησιμοποιήθηκε συχνά). οδηγούς εξωτερικές συσκευέςσυμβολίζεται με .DRV.

Όπως έχουμε ήδη σημειώσει, είναι αρκετά δύσκολο να προσδιοριστεί ο ακριβής αριθμός των API των Windows και τα αρχεία που τα περιέχουν, αλλά βρίσκονται όλα στον κατάλογο του συστήματος. Από αυτή την άποψη, είναι καλύτερο να ξεχωρίσουμε τη σύνθεση των βιβλιοθηκών που περιλαμβάνονται στον πυρήνα του λειτουργικού συστήματος και τις κύριες βιβλιοθήκες με βασικές πρόσθετες λειτουργίες.

Και τώρα μερικές συμβουλές.

Συμβουλή 1: Βεβαιωθείτε ότι η διαφήμισή σας DL έχει μορφοποιηθεί σωστά L-διαδικασίες

Η ίδια η κλήση προς τις διαδικασίες DLL στο πρόγραμμα μοιάζει ακριβώς με τις "κανονικές" διαδικασίες της Visual Basic, για παράδειγμα:

Κλήση DllName([λίστα ορισμάτων])

Ωστόσο, για να χρησιμοποιήσετε εξωτερικές συναρτήσεις DLL (συμπεριλαμβανομένου του Win API), πρέπει να δηλωθούν στο πρόγραμμα χρησιμοποιώντας τη δήλωση Declare, η οποία μοιάζει με αυτό:

Δήλωση Sub LibProcedureName _ “LibraryName” _ [([ArgumentList])]

Δήλωση συνάρτησης FunctionName _ Lib "LibraryName" _ [([ArgumentList])]

Εδώ, τα προαιρετικά στοιχεία του τελεστή δίνονται σε αγκύλες, οι μεταβλητές έκφρασης είναι με πλάγιους χαρακτήρες, οι υπόλοιπες λέξεις είναι λέξεις-κλειδιά. Το σύστημα βοήθειας έχει μια αρκετά καλή περιγραφή της σύνταξης του χειριστή, οπότε προς το παρόν θα κάνουμε μόνο μερικά σημεία.

διαφημίσεις εξωτερικές λειτουργίεςπρέπει να τοποθετηθεί στην ενότητα Γενικές Δηλώσεις της ενότητας. Εάν το τοποθετήσετε σε μια ενότητα φόρμας, τότε πρέπει να καθορίσετε λέξη-κλειδίΙδιωτικό (αυτή η δήλωση θα είναι διαθέσιμη μόνο εντός αυτής της ενότητας) - αυτός είναι ο περιορισμός για όλες τις διαδικασίες της ενότητας φόρμας.

Το σύνολο Win32 API υλοποιείται μόνο ως συναρτήσεις (το Win16 API είχε πολλές υπο-ρουτίνες). Ως επί το πλείστον, πρόκειται για συναρτήσεις τύπου Long, οι οποίες τις περισσότερες φορές επιστρέφουν τον κωδικό ολοκλήρωσης της λειτουργίας.

Η δήλωση Declare εμφανίστηκε στο MS Basic την εποχή του DOS και χρησιμοποιήθηκε επίσης για τη δήλωση των εσωτερικών διαδικασιών του έργου. Στη Visual Basic, αυτό δεν απαιτείται, καθώς η δήλωση των εσωτερικών διαδικασιών είναι αυτόματα δήλωση δευτερεύουσας ή συνάρτησης τους. Σε σύγκριση με το Basic/DOS, είναι υποχρεωτικό να προσδιορίσετε στη νέα περιγραφή το όνομα του αρχείου της βιβλιοθήκης όπου βρίσκεται η απαιτούμενη διαδικασία. Οι βιβλιοθήκες Wip API βρίσκονται στον κατάλογο συστήματος των Windows, επομένως αρκεί να δώσετε μόνο το όνομα του αρχείου. Εάν έχετε πρόσβαση σε ένα DLL που βρίσκεται σε αυθαίρετη τοποθεσία, πρέπει να σημειώσετε την πλήρη διαδρομή σε αυτό το αρχείο.

Η περιγραφή της δήλωσης Declare συνήθως καταλαμβάνει πολύ χώρο και δεν χωράει σε μία γραμμή στο παράθυρο κώδικα. Επομένως, συνιστούμε να ακολουθείτε κάποιο συγκεκριμένο σχήμα αλλαγής γραμμής κατά τη σύνταξη εφαρμογών, για παράδειγμα:

Δηλώστε τη συνάρτηση GetTempPath _ Lib "kernel32" Ψευδώνυμο "GetTempPathA" _ (ByVal nBufferLength As Long, _ ByVal lpBuffer As String) As Long

Σε αυτήν την περίπτωση, όλα τα κύρια στοιχεία της περιγραφής χωρίζονται σε διαφορετικές γραμμές και επομένως είναι καλά διαβασμένα.

Συμβουλή 2: Να είστε ιδιαίτερα προσεκτικοί όταν εργάζεστε με λειτουργίες DLL

Η χρήση του Win API και διαφόρων λειτουργιών DLL επεκτείνει σημαντικά τη λειτουργικότητα του VB και συχνά βελτιώνει την απόδοση των προγραμμάτων. Ωστόσο, η ανταμοιβή για αυτό είναι ο κίνδυνος μείωσης της αξιοπιστίας της εφαρμογής, ειδικά στη διαδικασία αποσφαλμάτωσης της.

Ένα από τα σημαντικότερα πλεονεκτήματα του περιβάλλοντος VB είναι η αξιοπιστία της διαδικασίας προγραμματισμού: λειτουργώντας υπό τον έλεγχο του διερμηνέα, ο κώδικας του προγράμματος δεν μπορεί θεωρητικά να διαταράξει τη λειτουργία των Windows και της ίδιας της VB. Ο προγραμματιστής μπορεί να μην είναι πολύ προσεκτικός στην ορθότητα της μετάδοσης παραμέτρων στις καλούμενες συναρτήσεις - τέτοια σφάλματα θα εντοπιστούν εύκολα από τον ίδιο τον διερμηνέα είτε κατά τη διαδικασία μετάφρασης του κώδικα είτε κατά την εκτέλεσή του. Στην πιο δυσάρεστη περίπτωση, η λειτουργία επεξεργασίας απλώς θα διακοπεί και με ένδειξη του πού και γιατί συνέβη το σφάλμα.

Η απευθείας χρήση λειτουργιών API των Windows ή άλλων DLL καταργεί αυτόν τον έλεγχο στη μεταφορά δεδομένων και την εκτέλεση κώδικα εκτός του περιβάλλοντος VB. Επομένως, ένα σφάλμα στην πρόσβαση σε εξωτερικές λειτουργίες μπορεί να οδηγήσει σε αλειτουργία τόσο της VB όσο και του λειτουργικού συστήματος. Αυτό ισχύει ιδιαίτερα στο στάδιο της ανάπτυξης του προγράμματος, όταν η παρουσία σφαλμάτων είναι απολύτως φυσική. Έτσι, εφαρμόζοντας τις ευρύτερες δυνατότητες των λειτουργιών του βασικού στρώματος του συστήματος, ο προγραμματιστής αναλαμβάνει την ευθύνη για την ορθότητα της εφαρμογής τους.

Το πρόβλημα επιδεινώνεται από το γεγονός ότι διαφορετικές γλώσσες προγραμματισμού χρησιμοποιούν διαφορετικούς τρόπους μετάδοσης παραμέτρων μεταξύ των διαδικασιών. (Ακριβέστερα, χρησιμοποιούνται διαφορετικές μέθοδοι μετάδοσης από προεπιλογή, καθώς πολλές γλώσσες μπορεί να υποστηρίζουν πολλαπλές μεθόδους.) Τα Win API υλοποιούνται σε C/C++ και χρησιμοποιούν συμβάσεις μετάδοσης παραμέτρων C/C++, οι οποίες είναι διαφορετικές από αυτές που χρησιμοποιείται στο VB .

Από αυτή την άποψη, πρέπει να σημειωθεί ότι η εμφάνιση αναλόγων λειτουργιών API ενσωματωμένων στο VB δικαιολογείται ακριβώς από την προσαρμογή του τελευταίου στη σύνταξη VB και την εφαρμογή του αντίστοιχου μηχανισμού ελέγχου ανταλλαγής δεδομένων. Σημειώστε επίσης ότι στο στάδιο του πειραματικού εντοπισμού σφαλμάτων της εφαρμογής, κατά τη δημιουργία μιας εκτελέσιμης μονάδας, είναι προτιμότερο να χρησιμοποιείτε την επιλογή μεταγλώττισης κωδικών P αντί για τον Native Code (κωδικός μηχανής). Στην πρώτη περίπτωση, το πρόγραμμα θα εκτελείται υπό τον έλεγχο ενός διερμηνέα - πιο αργό από τον κώδικα μηχανής, αλλά πιο αξιόπιστο όσον αφορά τις πιθανές λανθασμένες επιπτώσεις στο λειτουργικό σύστημα και παρέχει μια πιο βολική λειτουργία για τον εντοπισμό πιθανών σφαλμάτων.

Συμβουλή 3: Οι δέκα συμβουλές του Dan Appleman για αξιόπιστο προγραμματισμό API στη VB

Η χρήση μιας συνάρτησης API απαιτεί πιο προσεκτικό προγραμματισμό, χρησιμοποιώντας μερικές από τις πιο άγνωστες μεθόδους κλήσης διαδικασιών (σε σύγκριση με τη VB). Θα συνεχίσουμε να αντιμετωπίζουμε αυτά τα ζητήματα στη συνέχεια. Και τώρα εδώ είναι μια περίληψη των συμβουλών του Dan Appleman σχετικά με αυτό το θέμα (η πρώτη τους έκδοση εμφανίστηκε το 1993), με μερικές από τις προσθήκες και τα σχόλιά μας.

1. Θυμηθείτε το ByVal.Το πιο συνηθισμένο λάθος που γίνεται κατά την πρόσβαση σε λειτουργίες API και DLL είναι η εσφαλμένη χρήση της λέξης-κλειδιού ByVal: είτε ξεχνούν να την ορίσουν είτε, αντίθετα, την ορίζουν όταν δεν χρειάζεται.

Αυτά τα παραδείγματα δείχνουν την επίδραση της δήλωσης ByVal στη μετάδοση παραμέτρων

Τύπος παραμέτρου Με την ByVal Χωρίς ByVal
Ακέραιος αριθμός Ένας ακέραιος 16-bit ωθείται στη στοίβα. Η διεύθυνση 32 bit ενός ακέραιου αριθμού 16 bit προωθείται στη στοίβα.
Μακρύς Ένας ακέραιος αριθμός 32 bit ωθείται στη στοίβα. Η διεύθυνση 32 bit ενός ακέραιου αριθμού 32 bit προωθείται στη στοίβα.
Σειρά Η συμβολοσειρά μετατρέπεται στη μορφή που χρησιμοποιείται στο C (δεδομένα και ένα τερματικό null byte). Η διεύθυνση 32-bit της νέας γραμμής προωθείται στη στοίβα Ο περιγραφέας VB της συμβολοσειράς ωθείται στη στοίβα. (Τέτοιοι χειρισμοί δεν χρησιμοποιούνται ποτέ από το ίδιο το API των Windows και αναγνωρίζονται μόνο σε DLL που υλοποιούνται ειδικά για VB.)

Θα πρέπει να υπενθυμίσουμε εδώ ότι η μεταφορά των παραμέτρων σε οποιοδήποτε σύστημα προγραμματισμού, συμπεριλαμβανομένου του VB, πραγματοποιείται με δύο βασικούς τρόπους: με αναφορά (ByRef) ή με τιμή (ByVal). Στην πρώτη περίπτωση, μεταβιβάζεται η διεύθυνση της μεταβλητής (αυτή η επιλογή χρησιμοποιείται στη VB από προεπιλογή), στη δεύτερη - η τιμή της. Η θεμελιώδης διαφορά έγκειται στο γεγονός ότι με τη βοήθεια μιας αναφοράς, η αλλαγμένη τιμή της παραμέτρου που πέρασε επιστρέφεται στο καλούν πρόγραμμα.

Για να το κατανοήσετε αυτό, κάντε ένα πείραμα χρησιμοποιώντας τα ακόλουθα προγράμματα:

Dim v Ως ακέραιος v = 2 Κλήση MyProc(v) MsgBox “v = “ & v Sub MyProc (v Ως ακέραιος) v = v + 1 End Sub

Όταν εκτελείτε αυτό το παράδειγμα, θα λάβετε ένα μήνυμα με μεταβλητή τιμήίση με 3. Το γεγονός είναι ότι σε αυτήν την περίπτωση η διεύθυνση της μεταβλητής v, που δημιουργήθηκε φυσικά στο καλούν πρόγραμμα, μεταβιβάζεται στην υπορουτίνα MyProc. Τώρα αλλάξτε την περιγραφή της διαδικασίας σε

Sub MyProc (ByVal v As Integer)

Ως αποτέλεσμα, όταν εκτελείτε τη δοκιμή, θα λάβετε v = 2, επειδή μόνο η αρχική τιμή της μεταβλητής μεταβιβάζεται στη διαδικασία - το αποτέλεσμα των πράξεων που εκτελούνται σε αυτήν δεν επιστρέφεται στο πρόγραμμα κλήσης. Μπορείτε επίσης να αλλάξετε τη λειτουργία pass-by-value χρησιμοποιώντας τη δήλωση κλήσης ως εξής:

Sub MyProc (v As Integer) ... Καλέστε το MyProc((v)) ‘ (v) - οι παρενθέσεις υποδεικνύουν τη λειτουργία pass-by-value _.

Ωστόσο, όταν γίνεται αναφορά σε εσωτερικές διαδικασίες VB, η χρήση της λέξης-κλειδιού ByVal στη δήλωση κλήσης απαγορεύεται - αντί αυτού χρησιμοποιούνται παρενθέσεις. Αυτό έχει τη δική του εξήγηση.

Στην κλασική περίπτωση (C, Fortran, Pascal), η διαφορά μεταξύ των λειτουργιών ByRef και ByVal εξαρτάται από το τι ακριβώς τοποθετείται στη στοίβα ανταλλαγής δεδομένων - τη διεύθυνση της μεταβλητής ή την τιμή της. Το Basic χρησιμοποιεί ιστορικά μια παραλλαγή της εξομοίωσης λογισμικού ByVal - η διεύθυνση βρίσκεται πάντα στη στοίβα, αλλά μόνο όταν περνάει από την τιμή δημιουργείται μια προσωρινή μεταβλητή για αυτό. Για να γίνει διάκριση μεταξύ αυτών των δύο επιλογών (κλασική και βασική), χρησιμοποιούνται διαφορετικοί τρόποι περιγραφής της λειτουργίας ByVal. Σημειώστε ότι η εξομοίωση της λειτουργίας ByVal στο VB παρέχει υψηλότερη αξιοπιστία προγράμματος: μπερδεύοντας τη μορφή της κλήσης, ο προγραμματιστής κινδυνεύει μόνο να επιστραφεί (ή να μην επιστραφεί) η διορθωμένη τιμή της μεταβλητής στο καλούν πρόγραμμα. Στην "κλασική" έκδοση, ωστόσο, μια τέτοια σύγχυση μπορεί να οδηγήσει σε μοιραίο σφάλμα κατά την εκτέλεση της διαδικασίας (για παράδειγμα, όταν χρησιμοποιείται μια τιμή μεταβλητής ίση με, ας πούμε, μηδέν αντί για μια διεύθυνση μνήμης).

Οι συναρτήσεις DLL υλοποιούνται σύμφωνα με τις "κλασικές" αρχές και επομένως απαιτούν μια υποχρεωτική περιγραφή του τρόπου ανταλλαγής δεδομένων με καθένα από τα ορίσματα. Αυτός είναι ο σκοπός των δηλώσεων συναρτήσεων μέσω της περιγραφής Declare (ακριβέστερα, της λίστας των ορισμάτων που έχουν περάσει). Ο πιο συνηθισμένος τρόπος για να μεταβιβάσετε παραμέτρους σε μια συνάρτηση API ή DLL των Windows είναι να χρησιμοποιήσετε τη λέξη-κλειδί ByVal. Επιπλέον, μπορεί να ρυθμιστεί τόσο στη δήλωση Declare, όσο και απευθείας κατά την κλήση της συνάρτησης.

Οι συνέπειες της εσφαλμένης μετάδοσης παραμέτρων είναι εύκολο να προβλεφθούν. Εάν λάβετε μια προφανώς μη έγκυρη διεύθυνση, θα λάβετε ένα μήνυμα GPF (General Protection Fault). Εάν η συνάρτηση λάβει μια τιμή που ταιριάζει με μια έγκυρη διεύθυνση, τότε η συνάρτηση API θα ανιχνευτεί στην περιοχή κάποιου άλλου (για παράδειγμα, στον πυρήνα των Windows) με όλες τις επακόλουθες καταστροφικές συνέπειες.

2. Ελέγξτε τον τύπο των παραμέτρων που περάσατε.Εξίσου σημαντικό είναι ο σωστός αριθμός και ο σωστός τύπος παραμέτρων που έχουν περάσει. Τα ορίσματα που δηλώνονται στη δήλωση πρέπει να ταιριάζουν με τις αναμενόμενες παραμέτρους στη συνάρτηση API. Η πιο συνηθισμένη περίπτωση σφάλματος στη μετάδοση παραμέτρων σχετίζεται με τη διαφορά μεταξύ NULL και συμβολοσειράς μηδενικού μήκους - θυμηθείτε ότι δεν είναι το ίδιο πράγμα.

3. Ελέγξτε τον τύπο επιστροφής.

Η VB είναι αρκετά ανεκτική σε αναντιστοιχίες τύπου επιστροφής συναρτήσεων, καθώς οι αριθμητικές τιμές συνήθως επιστρέφονται μέσω καταχωρητών και όχι μέσω της στοίβας. Οι ακόλουθοι κανόνες θα σας βοηθήσουν να προσδιορίσετε τη σωστή τιμή που επιστρέφεται από μια συνάρτηση API:

  • Μια συνάρτηση DLL που δεν επιστρέφει μια τιμή (ανάλογη με την κενή στο 'C') πρέπει να δηλωθεί ως VB Sub.
  • μια συνάρτηση API που επιστρέφει μια ακέραια τιμή (Integer ή Long) μπορεί να οριστεί είτε ως Sub είτε ως μια Συνάρτηση που επιστρέφει μια τιμή του κατάλληλου τύπου.
  • καμία από τις συναρτήσεις API δεν επιστρέφει αριθμούς κινητής υποδιαστολής, αλλά ορισμένα DLL ενδέχεται να επιστρέφουν έναν τέτοιο τύπο δεδομένων.

4. Χρησιμοποιήστε την κατασκευή "As Any" με μεγάλη προσοχή.Πολλές λειτουργίες API των Windows έχουν τη δυνατότητα να δέχονται παραμέτρους διάφοροι τύποικαι χρησιμοποιήστε την κλήση με τη χρήση της κατασκευής As Any (η ερμηνεία του τύπου πραγματοποιείται ανάλογα με την τιμή άλλων παραμέτρων που έχουν περάσει).

Μια καλή λύση σε αυτήν την περίπτωση θα ήταν η χρήση πολλαπλών ψευδωνύμων συναρτήσεων, δημιουργώντας δύο ή περισσότερες δηλώσεις για την ίδια συνάρτηση, με κάθε δήλωση να καθορίζει παραμέτρους ενός συγκεκριμένου τύπου.

5. Μην ξεχάσετε να αρχικοποιήσετε τις συμβολοσειρές.Υπάρχουν πολλές συναρτήσεις στο Win API που επιστρέφουν πληροφορίες φορτώνοντας δεδομένα σε buffer συμβολοσειρών που έχουν περάσει ως παράμετρος. Στο πρόγραμμά σας, φαίνεται ότι κάνετε τα πάντα σωστά: μην ξεχάσετε το ByVal, περάστε σωστά τις παραμέτρους στη συνάρτηση. Αλλά τα Windows δεν μπορούν να ελέγξουν πόσο μεγάλο είναι το μέγεθος της μνήμης που έχει εκχωρηθεί για τη συμβολοσειρά. Η σειρά πρέπει να είναι αρκετά μεγάλη ώστε να χωράει όλα τα δεδομένα που μπορούν να τοποθετηθούν σε αυτήν. Είναι ευθύνη του προγραμματιστή VB να κρατήσει ένα buffer του σωστού μεγέθους.

Σημειώστε ότι σε Windows 32-bit, οι συμβολοσειρές μετατρέπονται από Unicode (κωδικοποίηση διπλού byte) σε ANSI (μονό byte) και αντίστροφα, λαμβάνοντας υπόψη τις εθνικές ρυθμίσεις του συστήματος. Επομένως, για να κρατήσετε buffers, μερικές φορές είναι πιο βολικό να χρησιμοποιείτε πίνακες byte αντί για μεταβλητές συμβολοσειράς. (Περισσότερα για αυτό θα συζητηθούν παρακάτω.)

Τις περισσότερες φορές, οι λειτουργίες Win API σάς επιτρέπουν να ορίζετε μόνοι σας το μέγιστο μέγεθος μπλοκ. Ειδικότερα, μερικές φορές αυτό απαιτεί την κλήση μιας άλλης συνάρτησης API που θα "προτρέπει" το μέγεθος του μπλοκ. Για παράδειγμα, το GetWindowTextLength σάς επιτρέπει να προσδιορίσετε το μέγεθος της συμβολοσειράς που απαιτείται για να χωρέσει τον τίτλο του παραθύρου που επιστρέφεται από τη συνάρτηση GetWindowText. Σε αυτήν την περίπτωση, τα Windows διασφαλίζουν ότι δεν βγαίνετε εκτός ορίων.

6. Βεβαιωθείτε ότι χρησιμοποιείτε το Option Explicit.

7. Ελέγξτε προσεκτικά τις τιμές των παραμέτρων και τις τιμές επιστροφής.Η VB έχει καλές δυνατότητες ελέγχου τύπου. Αυτό σημαίνει ότι όταν προσπαθείτε να περάσετε μια μη έγκυρη παράμετρο σε μια συνάρτηση VB, το χειρότερο πράγμα που μπορεί να συμβεί είναι να λάβετε ένα μήνυμα σφάλματος από τη VB. Αλλά αυτός ο μηχανισμός, δυστυχώς, δεν λειτουργεί κατά την πρόσβαση δυνατότητες των Windows API.

Τα Windows 9x διαθέτουν βελτιωμένο σύστημα ελέγχου παραμέτρων για τις περισσότερες λειτουργίες API. Επομένως, η παρουσία ενός σφάλματος στα δεδομένα συνήθως δεν προκαλεί μοιραίο σφάλμα, αλλά δεν είναι τόσο εύκολο να προσδιοριστεί τι το προκάλεσε.

Εδώ μπορούμε να σας συμβουλεύσουμε να χρησιμοποιήσετε διάφορους τρόπους για τον εντοπισμό σφαλμάτων αυτού του τύπου σφάλματος:

  • χρησιμοποιήστε τον εντοπισμό σφαλμάτων βήμα προς βήμα ή την εντολή Debug.Print για να επιθεωρήσετε κάθε ύποπτη κλήση συνάρτησης API. Ελέγξτε τα αποτελέσματα αυτών των κλήσεων για να βεβαιωθείτε ότι όλα είναι εντάξει και ότι η λειτουργία εξήλθε με χάρη.
  • χρησιμοποιήστε ένα πρόγραμμα εντοπισμού σφαλμάτων των Windows όπως το CodeView και μια έκδοση εντοπισμού σφαλμάτων των Windows (παρέχεται στο SDK των Windows). Αυτά τα εργαλεία μπορούν να εντοπίσουν ένα σφάλμα παραμέτρου και τουλάχιστον να προσδιορίσουν ποια συνάρτηση API προκαλεί το σφάλμα.
  • χρησιμοποιήστε πρόσθετα εργαλεία τρίτων για να ελέγξετε τους τύπους των παραμέτρων και την εγκυρότητα των τιμών τους. Τέτοια εργαλεία όχι μόνο μπορούν να βρουν σφάλματα παραμέτρων, αλλά ακόμη και να υποδείξουν τη γραμμή του κώδικα VB όπου παρουσιάστηκε το σφάλμα.

Επιπλέον, είναι απαραίτητο να ελέγξετε το αποτέλεσμα της εκτέλεσης της συνάρτησης API.

8. Να θυμάστε ότι οι ακέραιοι στη VB και στα Windows δεν είναι το ίδιο πράγμα.Πρώτα απ 'όλα, θα πρέπει να έχετε κατά νου ότι ο όρος "Integer" στη VB αναφέρεται σε έναν αριθμό 16 bit, στην τεκμηρίωση Win 32 - έναν αριθμό 32 bit. Δεύτερον, οι ακέραιοι αριθμοί (Integer και Long) στο VB είναι υπογεγραμμένες τιμές (δηλαδή, ένα bit χρησιμοποιείται ως σημάδι, τα υπόλοιπα χρησιμοποιούνται ως mantissa ενός αριθμού), στα Windows χρησιμοποιούνται μόνο μη αρνητικοί αριθμοί. Αυτή η περίσταση πρέπει να λαμβάνεται υπόψη όταν σχηματίζετε τη μεταδιδόμενη παράμετρο χρησιμοποιώντας αριθμητικές πράξεις (για παράδειγμα, υπολογίστε τη διεύθυνση αθροίζοντας κάποια βάση και μετατόπιση). Οι τυπικές αριθμητικές συναρτήσεις VB δεν είναι κατάλληλες για αυτό. Πώς να είμαστε σε αυτή την περίπτωση, θα μιλήσουμε ξεχωριστά.

9. Δώστε μεγάλη προσοχή στα ονόματα των συναρτήσεων.Σε αντίθεση με το Win16, τα ονόματα όλων των συναρτήσεων του Win32 API είναι ευαίσθητα στην ακριβή χρήση πεζών και κεφαλαία γράμματα(αυτό δεν συνέβη στο Win16). Εάν χρησιμοποιείτε πεζό αντί για κεφαλαίο κάπου ή το αντίστροφο, τότε η επιθυμητή λειτουργία δεν θα βρεθεί. Επίσης, προσέξτε τη σωστή χρήση του επιθέματος A ή W σε συναρτήσεις που λαμβάνουν παραμέτρους συμβολοσειράς. (Για περισσότερα σχετικά με αυτό, δείτε παρακάτω.)

10. Αποθηκεύστε συχνά την εργασία σας.Σφάλματα που σχετίζονται με εσφαλμένη χρήση του DLL και του Win API μπορεί να οδηγήσουν σε σφάλμα στο περιβάλλον VB και πιθανώς σε ολόκληρο το λειτουργικό σύστημα. Θα πρέπει να βεβαιωθείτε ότι ο κώδικας που γράφετε πριν από τη δοκιμαστική εκτέλεση έχει αποθηκευτεί. Το απλούστερο είναι να ρυθμίσετε τις λειτουργικές μονάδες για αυτόματη εγγραφή πριν την εκτέλεση του έργου σε VB.

Αφού διαβάσετε την προηγούμενη συμβουλή, μπορεί να σκεφτείτε ότι η χρήση των λειτουργιών Win API είναι μια επικίνδυνη επιχείρηση. Σε κάποιο βαθμό αυτό είναι αλήθεια, αλλά μόνο σε σύγκριση με τον ασφαλή προγραμματισμό που παρέχει η ίδια η VB. Αλλά με την επιδέξια εφαρμογή τους και τη γνώση των πιθανών παγίδων, αυτός ο κίνδυνος είναι ελάχιστος. Επιπλέον, είναι συχνά απλά αδύνατο να εγκαταλείψετε εντελώς τη χρήση του Win API - θα εξακολουθούν να απαιτούνται για οποιαδήποτε σοβαρή ανάπτυξη.

Επιπλέον, νωρίτερα αναφέραμε τις «παγίδες» για μια ευρεία κατηγορία DLL. Στην περίπτωση του Win API, όλα είναι πολύ πιο απλά, αφού η μορφή κλήσης αυτών των συναρτήσεων είναι σαφώς ενοποιημένη εδώ. Για να το κάνετε αυτό, θα πρέπει να έχετε υπόψη σας τα ακόλουθα βασικά σημεία:

  1. Οι συναρτήσεις Win32 API είναι ακριβώς συναρτήσεις, δηλαδή διαδικασίες τύπου Function (υπήρχαν πολλές Sub-ρουτίνες στο Win16 API). Αυτές είναι όλες συναρτήσεις τύπου Long, επομένως οι περιγραφές τους γράφονται ως εξής: Δηλώστε όνομα συνάρτησης ... Εφόσον «ο τύπος συνάρτησης _ ορίζεται ρητά

    Δήλωση Όνομα συνάρτησης& Ο τύπος συνάρτησης _ ορίζεται με επίθημα

    Η κλήση της συνάρτησης API μοιάζει με αυτό:

Αποτέλεσμα& = ApiName& ([ Λίστα επιχειρημάτων]
  1. Τις περισσότερες φορές, η τιμή επιστροφής μιας συνάρτησης είναι ο κωδικός εξόδου της λειτουργίας. Επιπλέον, μια μη μηδενική τιμή σε αυτή την περίπτωση σημαίνει κανονική ολοκλήρωση, μηδέν - σφάλμα. Μπορείτε συνήθως (αλλά όχι πάντα) να ελέγξετε τη φύση του σφάλματος καλώντας τη συνάρτηση GetLastError. Η περιγραφή αυτής της συνάρτησης είναι η εξής: Δηλώστε τη συνάρτηση GetLastError& Lib "kernel32" ()

    ΠΡΟΣΟΧΗ!Όταν εργάζεστε σε VB, είναι καλύτερο να χρησιμοποιείτε την ιδιότητα LastDLLError του αντικειμένου Err για να λάβετε την τιμή του εκλεπτυσμένου κωδικού σφάλματος, επειδή η VB μερικές φορές επαναφέρει τη συνάρτηση GetLastError μεταξύ της κλήσης του API και της συνέχισης με την εκτέλεση του προγράμματος.

    Μπορείτε να ερμηνεύσετε τον κώδικα που επιστρέφεται από το GelLastError χρησιμοποιώντας τις σταθερές που είναι γραμμένες στο αρχείο API32.TXT, με ονόματα που ξεκινούν με το επίθημα ERROR_.

    Πλέον τυπικά λάθηέχουν τους παρακάτω κωδικούς:

    • ERROR_INVALID_HANDLE = 6& - μη έγκυρη λαβή
    • ERROR_CALL_NOT_IMPLEMENTED = 120& - καλέστε στα Windows 9x μια συνάρτηση διαθέσιμη μόνο για Windows NT
    • ERROR_INVALID_PARAMETER = 87& - μη έγκυρη τιμή παραμέτρου

    Ωστόσο, πολλές συναρτήσεις επιστρέφουν την τιμή κάποιας ζητούμενης παραμέτρου (για παράδειγμα, το OpenFile επιστρέφει την τιμή ενός περιγραφέα αρχείου). Σε τέτοιες περιπτώσεις, το σφάλμα ορίζεται από κάποια άλλη ειδική τιμή Return&, συνηθέστερα 0 ή -1.

  2. Τα Win32 API χρησιμοποιούν αυστηρά καθορισμένους τρόπους για να περάσουν τους απλούστερους τύπους δεδομένων. α) ByVal ... Όσο καιρό

    Οι μεγάλες μεταβλητές χειρίζονται τουλάχιστον το 80% του επιχειρήματος. Σημειώστε ότι το επιχείρημα πάνταακολουθείται από τη λέξη-κλειδί ByVal, η οποία, μεταξύ άλλων, σημαίνει ότι πραγματοποιείται μονόδρομη μεταφορά δεδομένων - από το πρόγραμμα VB στη λειτουργία API.

    Β) ByVal ... As String

    Αυτός ο τύπος μεταφοράς δεδομένων είναι επίσης αρκετά συνηθισμένος, και με επιχείρημα επίσης πάνταΕφαρμόζεται το ByVal. Όταν καλείται μια συνάρτηση API, η διεύθυνση της συμβολοσειράς γράφεται στη στοίβα, επομένως σε αυτήν την περίπτωση, είναι δυνατή η αμφίδρομη ανταλλαγή δεδομένων. Υπάρχουν αρκετοί κίνδυνοι που πρέπει να γνωρίζετε όταν εργάζεστε με χορδές.

    Το πρώτο είναι ότι η μνήμη είναι δεσμευμένη για μια συμβολοσειρά στο πρόγραμμα κλήσης, επομένως εάν η συνάρτηση API θα γεμίσει συμβολοσειρές, τότε πριν την καλέσετε, πρέπει να δημιουργήσετε μια συμβολοσειρά του απαιτούμενου μεγέθους. Για παράδειγμα, η συνάρτηση GetWindowsDirectory επιστρέφει τη διαδρομή προς τον κατάλογο των Windows, η οποία εξ ορισμού δεν πρέπει να είναι μεγαλύτερη από 144 χαρακτήρες. Κατά συνέπεια, η κλήση σε αυτήν τη συνάρτηση θα πρέπει να μοιάζει κάπως έτσι:

    WinPath$ = Space$(144) 'δεσμευμένη συμβολοσειρά σε _ 144 χαρακτήρες Αποτέλεσμα& = GetWindowsDirectory& (WinTath$, 144) _ 'πλήρωση buffer' Αποτέλεσμα& - πραγματικός αριθμός χαρακτήρων στο όνομα καταλόγου _ WinPath$ = Left$(WinPath, Result&)

    Το δεύτερο πρόβλημα είναι ότι όταν καλείται η συνάρτηση API, η συμβολοσειρά προέλευσης μετατρέπεται σε κάποια εσωτερική αναπαράστασή της και το αντίστροφο όταν η συνάρτηση τερματίζεται. Εάν κατά τη στιγμή του Win16 αυτή η λειτουργία συνίστατο μόνο στην προσθήκη ενός null byte στο τέλος της συμβολοσειράς, τότε με την εμφάνιση του Win32, προστέθηκε σε αυτό ο μετασχηματισμός του Unicode κωδικοποίησης δύο byte σε ANSI και αντίστροφα. (Αυτό συζητήθηκε λεπτομερώς στο άρθρο "Features of Working with String Variables in VB", ComputerPress 10'99 και 01'2000). Προς το παρόν, απλώς σημειώστε ότι χρησιμοποιώντας το ByVal ... Ως δομή String, μπορείτε να ανταλλάξετε συμβολοσειρές μόνο με δεδομένα χαρακτήρων.

    Γ) ... Ως Οποιαδήποτε

    Αυτό σημαίνει ότι κάποια διεύθυνση buffer μνήμης θα προωθηθεί στη στοίβα, τα περιεχόμενα της οποίας θα ερμηνευθούν από τη συνάρτηση API, για παράδειγμα, ανάλογα με την τιμή άλλων ορισμάτων. Ωστόσο, το As Any μπορεί να χρησιμοποιηθεί μόνο σε μια δήλωση Declare - μια συγκεκριμένη μεταβλητή πρέπει να οριστεί ως όρισμα όταν πραγματοποιείται μια συγκεκριμένη κλήση στη συνάρτηση.

    Δ) ... Ως UserDefinedType

    Μια τέτοια κατασκευή χρησιμοποιείται επίσης συχνά όταν είναι απαραίτητη η ανταλλαγή δεδομένων (γενικά και προς τις δύο κατευθύνσεις) χρησιμοποιώντας κάποια δομή. Αυτή η κατασκευή είναι στην πραγματικότητα κάποιο είδος συγκεκριμένης υλοποίησης της φόρμας μεταφοράς As Any, απλώς σε αυτήν την περίπτωση η συνάρτηση έχει οριστεί σε μια σταθερή δομή.

    Η μορφή της δομής δεδομένων ορίζεται από μια συγκεκριμένη συνάρτηση API και είναι ευθύνη του προγραμματιστή να την περιγράψει σωστά και να την κρατήσει στο καλούν πρόγραμμα. Ένα τέτοιο σχέδιο πάνταμεταχειρισμένος χωρίςλέξεις ByVal, δηλαδή, σε αυτήν την περίπτωση, πραγματοποιείται μετάβαση με αναφορά - η διεύθυνση της μεταβλητής γράφεται στη στοίβα.

Ένα παράδειγμα κλήσης μιας συνάρτησης API

Ας επεξηγήσουμε τα παραπάνω με ένα παράδειγμα χρήσης δύο χρήσιμων συναρτήσεων αρχείου - lopen και lread , οι οποίες περιγράφονται ως εξής:

Δήλωση συνάρτησης lread Lib "kernel32" _ Ψευδώνυμο "_lread" (_ ByVal lpFileName As String, _ ByVal wReadWrite As Long) As Long Δήλωση συνάρτησης lread Lib "kernel32" _ Ψευδώνυμο "_lread" (_ Fi · Le Long, lpBuffer As Any, _ ByVal wBytes As Long) As Long

Στη VB, οι αντίστοιχοι - σε αυτήν την περίπτωση, οι ακριβείς - είναι οι τελεστές Open και Get (για Binary mode). Ας δώσουμε αμέσως προσοχή στη χρήση της λέξης-κλειδιού Alias ​​στη δήλωση συνάρτησης - αυτή είναι ακριβώς η περίπτωση που δεν μπορείτε να το κάνετε χωρίς αυτήν. Τα πραγματικά ονόματα συναρτήσεων στη βιβλιοθήκη ξεκινούν με μια υπογράμμιση (τυπικό στυλ C), η οποία δεν επιτρέπεται στη VB.

Η λειτουργία ανοίγματος αρχείου μπορεί να μοιάζει με αυτό:

Const INVALID_HANDLE_VALUE = -1 ' μη έγκυρη _ τιμή λαβής lpFileName$ = "D:\calc.bas" ' όνομα αρχείου wReadWrite& = 2 ' λειτουργία ανάγνωσης-εγγραφής hFile& = άνοιγμα(lpFileName$, wReadWrite&) _ 'Ορισμός λαβής αρχείου INhVHIDALUE&= Τότε _ ' σφάλμα ανοίγματος αρχείου ' Καθορισμός του κωδικού σφάλματος CodeError& = Err.LastDllError 'CodeError& = GetLastError _ ' αυτή η κατασκευή δεν λειτουργεί Τέλος Εάν

Εδώ πρέπει να δώσετε προσοχή σε δύο σημεία:

  • ως τιμή της συνάρτησης, παίρνουμε την τιμή του περιγραφέα αρχείου. Ένα σφάλμα αντιστοιχεί σε τιμή -1.
  • μόνο σε αυτήν την περίπτωση, η κλήση στη συνάρτηση GetLastError δεν λειτουργεί - για να λάβουμε την ακριβή τιμή σφάλματος, στραφήκαμε στο αντικείμενο Err (μιλήσαμε για την πιθανότητα μιας τέτοιας κατάστασης παραπάνω).

Στη συνέχεια, μπορείτε να διαβάσετε τα περιεχόμενα του αρχείου, αλλά αυτό προϋποθέτει ότι ο προγραμματιστής πρέπει να έχει κάποια κατανόηση της δομής του (όπως ακριβώς συμβαίνει όταν εργάζεται με αυθαίρετα δυαδικά αρχεία). Σε αυτήν την περίπτωση, η κλήση στη συνάρτηση lread μπορεί να μοιάζει με αυτό:

Dim MyVar As Single wBytes = lread (hFile&, MyVar, Len(MyVar) ' ανάγνωση πραγματικού αριθμού, 4 byte ' wBytes είναι ο αριθμός των δεδομένων που πραγματικά διαβάστηκαν, ' -1 είναι σφάλμα... Πληκτρολογήστε MyStruct x Ως Single i As Ακέραιος Τύπος τέλους Dim MyVar As MyStruct wBytes = lread (hFile&, MyVar, Len(MyVar)) ' διάβασε δομή δεδομένων, 6 byte

Σημειώστε ξανά ότι το δεύτερο όρισμα στη συνάρτηση μεταβιβάζεται με αναφορά, το υπόλοιπο με τιμή.

Dim MyVar As String MyVar = Space$(10) 'reserve variable for 10 characters wBytes = lread (hFile&, ByVal MyVar, Len(MyVar)) ' ανάγνωση συμβολοσειράς χαρακτήρων, 10 χαρακτήρες

Εδώ μπορείτε να δείτε μια σημαντική διαφορά από το προηγούμενο παράδειγμα - μια μεταβλητή συμβολοσειράς συνοδεύεται απαραίτητα από τη λέξη-κλειδί ByVal.

Η ανάγνωση των περιεχομένων ενός αρχείου σε έναν πίνακα (για λόγους απλότητας, θα χρησιμοποιήσουμε έναν μονοδιάστατο πίνακα byte) γίνεται ως εξής:

Dim MyArray(1 έως 10) Ως Byte wBytes = lread (hFile&, MyArray(1), _ Len(MyArray(1))* 10) ‘ ανάγνωση 10 στοιχείων πίνακα

Καθορίζοντας το πρώτο στοιχείο του πίνακα ως όρισμα, περνάμε τη διεύθυνση της αρχής της περιοχής μνήμης που έχει δεσμευτεί για τον πίνακα. Προφανώς, οποιοδήποτε τμήμα του πίνακα μπορεί να συμπληρωθεί με αυτόν τον τρόπο:

WBytes = lread (hFile&, MyArray(4), _ Len(MyArray(1))* 5) ' ανάγνωση στοιχείων πίνακα από την 4η στην 8η

Συμβουλή 5: Χρησιμοποιήστε το ψευδώνυμο για μεταδόσειςκαι παραμέτρους Ως Οποιαδήποτε

Εδώ, με βάση το προηγούμενο παράδειγμα, θα αποκαλύψουμε την ουσία της τέταρτης συμβουλής του Dan Appleman.

Όταν εργάζεστε με τη συνάρτηση lread, θα πρέπει να θυμάστε ότι κατά την πρόσβαση σε αυτήν χρησιμοποιώντας μια μεταβλητή συμβολοσειράς, πρέπει να χρησιμοποιήσετε τη λέξη-κλειδί ByVal (διαφορετικά το μήνυμα σχετικά με μια παράνομη λειτουργία δεν μπορεί να αποφευχθεί). Για να είστε ασφαλείς, μπορείτε να κάνετε μια πρόσθετη ειδική περιγραφή της ίδιας συνάρτησης για να λειτουργεί μόνο με μεταβλητές συμβολοσειράς:

Δηλώστε τη συνάρτηση lreadString Lib "kernel32" _ Ψευδώνυμο "_lread" (_ ByVal hFile As Long, ByVal lpBuffer As String, _ ByVal wBytes As Long) As Long

Όταν εργάζεστε με αυτήν την περιγραφή, δεν χρειάζεται πλέον να προσδιορίζετε το ByVal κατά την πρόσβαση:

WBytes = lreadString (hFile&, MyVarString, _ Len(MyVarString)) '

Φαίνεται ότι η σύνταξη του τελεστή Declare σάς επιτρέπει να κάνετε μια τέτοια ειδική δήλωση για έναν πίνακα:

Δηλώστε τη συνάρτηση lreadString Lib "kernel32" Ψευδώνυμο "_lread" (_ ByVal hFile As Long, lpBuffer() As Byte, _ ByVal wBytes As Long) As Long

Ωστόσο, η έφεση

WBytes = lreadArray(hFile&, MyArray(), 10)

οδηγεί αναπόφευκτα σε μοιραίο σφάλμα προγράμματος.

Αυτή είναι μια συνέχεια της συζήτησης σχετικά με τις ιδιαιτερότητες της επεξεργασίας μεταβλητών συμβολοσειρών στη Visual Basic: Η VB χρησιμοποιεί κωδικοποίηση Unicode δύο byte, το Win API χρησιμοποιεί μια κωδικοποίηση ANSI ενός byte (επιπλέον, με τη μορφή που υιοθετείται στο C, με ένα null byte στο τέλος). Κατά συνέπεια, όταν χρησιμοποιούνται μεταβλητές συμβολοσειράς ως όρισμα, η μετατροπή από Unicode σε ANSI εκτελείται πάντα αυτόματα κατά την κλήση μιας συνάρτησης API (ακριβέστερα, μιας συνάρτησης DLL) και αντίστροφα κατά την επιστροφή.

Το συμπέρασμα από αυτό είναι απλό: Οι μεταβλητές συμβολοσειράς μπορούν να χρησιμοποιηθούν για την ανταλλαγή δεδομένων χαρακτήρων, αλλά δεν μπορούν να χρησιμοποιηθούν για την ανταλλαγή αυθαίρετων δεδομένων. δυαδικές πληροφορίες(όπως ήταν όταν εργάζονταν με εκδόσεις 16-bit της VB). Στην τελευταία περίπτωση, είναι καλύτερο να χρησιμοποιήσετε έναν μονοδιάστατο πίνακα byte.

Όπως γνωρίζετε, ο τύπος String μπορεί να χρησιμοποιηθεί για να περιγράψει μια προσαρμοσμένη δομή. Από αυτή την άποψη, πρέπει να θυμόμαστε τα ακόλουθα:

  • Απαγορεύεται αυστηρά η χρήση της ακόλουθης κατασκευής για πρόσβαση στο Win API: Πληκτρολογήστε MyStruct x As Single s As String «μεταβλητό μήκος συμβολοσειράς Τύπος τέλους

    Στην περίπτωση μιας συμβολοσειράς μεταβλητού μήκους, ένας περιγραφέας συμβολοσειράς μεταβιβάζεται ως μέρος της δομής, με όλες τις επακόλουθες συνέπειες με τη μορφή σφάλματος εκτέλεσης προγράμματος.

  • Μπορείτε να χρησιμοποιήσετε μια συμβολοσειρά σταθερού μήκους ως στοιχείο δομής: Πληκτρολογήστε MyStruct x As Single s As String*8 ' string string end Type

Σε αυτήν την περίπτωση, εκτελείται η αντίστοιχη μετατροπή κωδικοποίησης.

Και η τελευταία σημείωση: δεν μπορείτε να χρησιμοποιήσετε μια σειρά από μεταβλητές συμβολοσειράς (τόσο σταθερού όσο και μεταβλητού μήκους) κατά την πρόσβαση σε μια συνάρτηση API σε καμία περίπτωση. Διαφορετικά, η εμφάνιση μιας «παράνομης επιχείρησης» θα είναι εγγυημένη.

Είναι πιθανό ότι θα έχετε μια κατάσταση όπου πρέπει να γράψετε τις δικές σας συναρτήσεις DLL. Η ανάγκη για αυτό θα προκύψει αναπόφευκτα εάν χρησιμοποιείτε την τεχνολογία μικτού προγραμματισμού - τη χρήση δύο ή περισσότερων γλωσσών προγραμματισμού για την υλοποίηση μιας εφαρμογής.

Από αυτή την άποψη, σημειώνουμε ότι ο μεικτός προγραμματισμός είναι αρκετά συνηθισμένος για την υλοποίηση μιας αρκετά περίπλοκης εφαρμογής. Πράγματι, κάθε γλώσσα (ακριβέστερα, ένα σύστημα προγραμματισμού που βασίζεται σε μια γλώσσα) έχει τα δικά της δυνατά και αδύνατα σημεία, επομένως είναι πολύ λογικό να χρησιμοποιείτε τα πλεονεκτήματα διαφορετικών εργαλείων για την επίλυση διαφορετικών προβλημάτων. Για παράδειγμα, VB - για τη δημιουργία διεπαφής χρήστη, C - για αποτελεσματική πρόσβαση στους πόρους του συστήματος, Fortran - για την υλοποίηση αριθμητικών αλγορίθμων.

Η γνώμη του συγγραφέα είναι η εξής: κάθε σοβαρός προγραμματισμός απαιτεί από τον προγραμματιστή να κατέχει τουλάχιστον δύο εργαλεία. Φυσικά, στις σημερινές συνθήκες ενός ξεκάθαρου καταμερισμού εργασίας, είναι πολύ δύσκολο να είσαι άριστος ειδικός ακόμη και σε δύο συστήματα, επομένως το σχήμα «κύριες και βοηθητικές γλώσσες» είναι πιο λογικό. Η ιδέα εδώ είναι ότι ακόμη και μια ελάχιστη γνώση της «βοηθητικής» γλώσσας (γράψιμο αρκετά απλών διαδικασιών) μπορεί να βελτιώσει σημαντικά την αποτελεσματικότητα της «κύριας» γλώσσας. Σημειώστε ότι η γνώση της VB, τουλάχιστον ως βοηθητική, είναι σήμερα σχεδόν υποχρεωτική προϋπόθεση για έναν επαγγελματία προγραμματιστή. Παρεμπιπτόντως, στις μέρες του DOS για οποιονδήποτε προγραμματιστή, συμπεριλαμβανομένου του Basic, ήταν πολύ επιθυμητό να γνωρίζει τα βασικά του Assembler.

Με τον ένα ή τον άλλο τρόπο, αλλά ακόμη και σε συνθήκες ομαδικής εργασίας, όταν κάθε προγραμματιστής ασχολείται με τη δική του συγκεκριμένη επιχείρηση, η ιδέα των χαρακτηριστικών της διαδικαστικής διεπαφής στο διαφορετικές γλώσσεςπρέπει να είναι διαθέσιμη σε όλους τους συμμετέχοντες στο έργο. Και να γνωρίζετε ότι πολλά συστήματα προγραμματισμού (συμπεριλαμβανομένου του VB), εκτός από την προεπιλεγμένη διεπαφή, σας επιτρέπουν να χρησιμοποιήσετε άλλες, εκτεταμένες μεθόδους για την κλήση διαδικασιών, οι οποίες καθιστούν δυνατή την προσαρμογή της διεπαφής σε άλλη γλώσσα.

Κατά τη μελέτη της διαδικαστικής διεπαφής, θα πρέπει να δώσετε προσοχή στις ακόλουθες πιθανές «παγίδες»:

  • Διαφορετικές γλώσσες μπορεί να χρησιμοποιούν διαφορετικές συμβάσεις για τη σύνταξη αναγνωριστικών. Για παράδειγμα, είναι σύνηθες να χρησιμοποιείται μια υπογράμμιση στην αρχή ενός ονόματος διαδικασίας, η οποία δεν επιτρέπεται στη VB. Αυτό το πρόβλημα επιλύεται εύκολα χρησιμοποιώντας τη λέξη-κλειδί Alias ​​στη δήλωση Declare (βλ. Συμβουλή 2-3 για παράδειγμα).
  • Μπορεί να χρησιμοποιηθεί μια διαφορετική ακολουθία εγγραφής που μεταβιβάζονται ορίσματα στη στοίβα. Για παράδειγμα, στις μέρες του DOS (για να είμαι ειλικρινής - δεν ξέρω πώς φαίνεται τώρα σε περιβάλλον Windows), ο C έγραφε επιχειρήματα από το τέλος της λίστας, άλλες γλώσσες​​(Fortran, Pascal, Basic ) - από την αρχή.
  • Από προεπιλογή, χρησιμοποιούνται διαφορετικές αρχές για τη μετάδοση παραμέτρων - με αναφορά ή με τιμή.
  • Διάφορες αρχές για την αποθήκευση μεταβλητών συμβολοσειράς. Για παράδειγμα, στο C (όπως και στο Fortran και το Pascal) το μήκος μιας συμβολοσειράς καθορίζεται από ένα null byte στο τέλος της, ενώ στο Basic το μήκος γράφεται ρητά στον περιγραφέα συμβολοσειράς. Φυσικά, πρέπει να έχετε κατά νου τη δυνατότητα χρήσης διαφορετικών κωδικοποιήσεων χαρακτήρων.
  • Κατά τη μεταφορά πολυδιάστατων πινάκων, θα πρέπει να θυμόμαστε ότι υπάρχουν διάφορες επιλογές για τη μετατροπή πολυδιάστατων δομών σε μονοδιάστατες (ξεκινώντας από τον πρώτο δείκτη ή από τον τελευταίο, σε σχέση με δισδιάστατους πίνακες - "κατά γραμμές" ή "κατά στήλες ”).

Έχοντας αυτό υπόψη, μπορούν να διατυπωθούν οι ακόλουθες συστάσεις:

  • Χρησιμοποιήστε τους απλούστερους, αποδεδειγμένους τρόπους για να μεταβιβάσετε ορίσματα σε συναρτήσεις DLL. Τα πρότυπα που υιοθετήθηκαν για το Win API είναι αρκετά κατάλληλα ως μοντέλο.
  • Ποτέ μην περνάτε πίνακες μεταβλητών συμβολοσειρών.
  • Να είστε πολύ προσεκτικοί με τη μεταβίβαση απλών μεταβλητών συμβολοσειρών και πολυδιάστατων πινάκων.
  • Βεβαιωθείτε ότι έχετε ελέγξει τη λειτουργικότητα του μηχανισμού μεταβίβασης ορισμάτων προς και από την καλούμενη διαδικασία με ειδικό τρόπο. Γράψτε μια προσαρμοσμένη δοκιμή για να ελέγξετε τη μεταφορά δεδομένων. Ελέγξτε ξεχωριστά ότι κάθε όρισμα έχει περάσει σωστά. Για παράδειγμα, εάν έχετε μια διαδικασία με πολλά ορίσματα, ελέγξτε πρώτα την ορθότητα της μετάδοσης κάθε παραμέτρου για μια παραλλαγή με ένα όρισμα και μόνο τότε - για ολόκληρη τη λίστα.

Τι γίνεται όμως αν η συνάρτηση DLL είναι ήδη γραμμένη, για παράδειγμα, στο Fortran, αλλά η διεπαφή εισόδου της δεν ταιριάζει πολύ στα παραπάνω πρότυπα VB; Υπάρχουν δύο συμβουλές εδώ. Πρώτον: γράψτε μια δοκιμαστική συνάρτηση DLL και χρησιμοποιήστε την για να προσπαθήσετε να βρείτε τη σωστή κλήση από το πρόγραμμα VB με δοκιμή και σφάλμα. Δεύτερον: γράψτε μια διαδικασία προσαρμογέα στο ίδιο Fortran που θα παρείχε μια απλή διεπαφή μεταξύ VB και μιας συνάρτησης DLL με τη μετατροπή απλών δομών δεδομένων σε σύνθετες (για παράδειγμα, μετατροπή ενός πολυδιάστατου πίνακα byte σε πίνακα συμβολοσειρών).

Λοιπόν: χρησιμοποιήστε συναρτήσεις DLL. Μείνετε όμως σε εγρήγορση...

ComputerPress 9 "2000

Ήρθε η ώρα να μιλήσουμε για μια τέτοια έννοια όπως Λειτουργία API στη Visual Basic. Γιατί είναι σημαντικές αυτές οι λειτουργίες στη Visual Basic; Ας δούμε, πρώτον, όταν ξεκινήσετε τον προγραμματισμό στη Visual Basic, θα καταλάβετε αμέσως ότι χρησιμοποιώντας αυτές τις λειτουργίες μπορείτε να γράψετε πολύ σοβαρά προγράμματα και δεύτερον, απλά δεν μπορείτε να κάνετε πολλά χωρίς τη χρήση συναρτήσεων API, για παράδειγμα, σχεδόν οτιδήποτε σχετίζεται με τη χρήση το λειτουργικό σύστημα Windows ( για παράδειγμα: μάθετε το όνομα χρήστη, τον χώρο στον σκληρό δίσκο και ούτω καθεξής).

Αλλά για να αρχίσετε να εφαρμόζετε αυτές τις δυνατότητες στην πράξη, πρέπει να γνωρίζετε ποιες είναι, ας μιλήσουμε πρώτα γι' αυτό.

Theory on Visual Basic API Functions

APIείναι μια συντομογραφία του Application Programming Interface ( διεπαφή προγραμματισμού εφαρμογών). Με άλλα λόγια, ένα API είναι ένα σύνολο λειτουργιών που το ίδιο το λειτουργικό σύστημα δίνει στον προγραμματιστή να χρησιμοποιήσει στα προγράμματά του. Χρησιμοποιώντας το API, οι προγραμματιστές μπορούν εύκολα να εφαρμόσουν τις ιδέες τους.

Οι συναρτήσεις API μπορούν να κληθούν από τη Visual Basic για την εκτέλεση εργασιών για τις οποίες ο τυπικός κώδικας της Visual Basic είναι ανεπαρκής. Για παράδειγμα, τα τυπικά εργαλεία της Visual Basic δεν σας επιτρέπουν να απενεργοποιήσετε τον υπολογιστή σας ή να τον επανεκκινήσετε. Ωστόσο, όλα αυτά μπορούν εύκολα να γίνουν καλώντας την κατάλληλη συνάρτηση API.

Σχεδόν όλες οι λειτουργίες που βρίσκονται στα Windows βρίσκονται μέσα στο DLL ( Βιβλιοθήκη Dynamic Link). Όλα τα αρχεία dll βρίσκονται στο φάκελο συστήματος των Windows. Υπάρχουν πάνω από 1.000 λειτουργίες API που εμπίπτουν περίπου σε τέσσερις κύριες κατηγορίες.

  • Εργασία με εφαρμογές - εκκίνηση και κλείσιμο εφαρμογών, επεξεργασία εντολών μενού, μετακίνηση και αλλαγή μεγέθους παραθύρων.
  • Γραφικά - δημιουργία εικόνων.
  • Πληροφορίες συστήματος - ορισμός του τρέχοντος δίσκου, μέγεθος μνήμης, τρέχον όνομα χρήστη κ.λπ.
  • Εργασία με το μητρώο - χειρισμοί με το μητρώο των Windows.

Εφαρμογή των λειτουργιών API στην πράξη

Τώρα ας προχωρήσουμε στη χρήση αυτών των λειτουργιών στην πράξη. Οι συναρτήσεις API που καλούνται στη Visual Basic πρέπει πρώτα να δηλωθούν. Η δήλωση καθορίζει το όνομα του DLL και της συνάρτησης, καθώς και πληροφορίες σχετικά με τον αριθμό και τον τύπο των ορισμάτων.

Οι διαδικασίες DLL δηλώνονται με την εντολή Declare στην ενότητα General Declarations μιας ενότητας φόρμας ή μιας τυπικής λειτουργικής μονάδας:

Δήλωση ονόματος συνάρτησης Lib "library" [([ _ μεταβλητή [,ByVal,] μεταβλητή ]...])] Ως τύπος

Οι διαδικασίες DLL που βρίσκονται σε τυπικές λειτουργικές μονάδες είναι δημόσιες από προεπιλογή και μπορούν να κληθούν από οπουδήποτε στην εφαρμογή. Οι διαδικασίες που δηλώνονται σε μια ενότητα φόρμας είναι ιδιωτικές και πρέπει να προηγείται η λέξη-κλειδί Ιδιωτική.

Η ενότητα Lib σάς λέει πού να αναζητήσετε το αρχείο DLL που περιέχει τη συνάρτηση. Όταν γίνεται αναφορά σε βασικές βιβλιοθήκες των Windows (user32.dll, kernel32.dll, gdi.dll), η επέκταση είναι προαιρετική.

Εάν η διαδρομή προς το αρχείο δεν έχει καθοριστεί, τότε η περιήγηση στον κατάλογο ξεκινά με την ακόλουθη σειρά

  1. Κατάλογος που περιέχει το αρχείο EXE του προγράμματος.
  2. τρέχων κατάλογος?
  3. κατάλογος συστήματος των Windows.
  4. Κατάλογος των Windows.
  5. Μεταβλητή περιβάλλοντος διαδρομής.

Ακολουθεί μια μικρή λίστα με τυπικά DLL των Windows:

  • advapi.dll - NT προστασία, μητρώο και άλλες προηγμένες υπηρεσίες.
  • comdlg.dll - τυπικά παράθυρα διαλόγου.
  • gdi.dll - διεπαφή συσκευής γραφικών.
  • kernel32.dll - μνήμη, δίσκοι, διεργασίες, πόροι.
  • mpr.dll - δίκτυα;
  • netapi32.dll - βιβλιοθήκη API δικτύου.
  • shell32.dll - Κέλυφος των Windows, μεταφορά και απόθεση, επιλογή εικονιδίου.
  • user32.dll - διεπαφή χρήστη - παράθυρα, μενού, γραμμές, μηνύματα.
  • version.dll - έλεγχος έκδοσης.
  • winmm.dll - πολυμέσα, ήχος, joysticks, χρονόμετρα.
  • Το winspoll.dll είναι ο διαχειριστής εκτυπώσεων.

Οι περισσότερες διαδικασίες DLL τεκμηριώνονται χρησιμοποιώντας σημειογραφία γλώσσας προγραμματισμού C και C++. Για να μετατρέψετε με επιτυχία μια συνάρτηση API σε εντολή Declare, πρέπει να κατανοήσετε τον μηχανισμό μετάδοσης ορισμάτων. Τα επιχειρήματα συνήθως περνούν από την αξία. Σε αυτήν την περίπτωση, η λέξη-κλειδί ByVal τοποθετείται πριν από το όνομα του ορίσματος. Εάν το όρισμα περάσει με αναφορά, ορίζεται το ByRef.

Ακολουθεί η μικρότερη λίστα συναρτήσεων που χρησιμοποιούνται στη Visual Basic:

  • BitBlt - αντιγράφει μια εικόνα από ένα hDC σε άλλο.
  • FindWindow - βρίσκει τη λαβή του παραθύρου με την καθορισμένη Λεζάντα.
  • GetCursorPos - επιστρέφει την τρέχουσα θέση του δρομέα του ποντικιού (καθολικά).
  • GetDriveType - επιστρέφει τον τύπο μονάδας.
  • GetForegroundWindow - επιστρέφει τη λαβή του ενεργού παραθύρου.
  • SetCursorPos - ορίζει τη νέα θέση του δρομέα του ποντικιού.
  • SetVolumeLabel - αλλάζει την ετικέτα του δίσκου.
  • SetWindowPos - ορίζει τη θέση του παραθύρου με μια συγκεκριμένη λαβή (μπορείτε επίσης να χρησιμοποιήσετε αυτήν τη λειτουργία για να κάνετε το παράθυρο να βρίσκεται στην κορυφή όλων.
  • ShellExecute - Εκτελεί μια εφαρμογή που σχετίζεται με μια επέκταση που έχει καθορισμένο αρχείο(μπορεί επίσης να εκτελέσει την καθορισμένη εφαρμογή).
  • ShowCursor - Αποκρύπτει ή εμφανίζει τον δρομέα του ποντικιού στην οθόνη.

Παραδείγματα Μητρώου

Επίσης, κατά τον προγραμματισμό στη Visual Basic και σε άλλες γλώσσες, υπάρχει πρόβλημα όταν πρέπει να χρησιμοποιήσετε το μητρώο των Windows, αλλά με τη βοήθεια των λειτουργιών api είναι εύκολο να το κάνετε, για παράδειγμα:

Για να διαβάσετε μια παράμετρο συμβολοσειράς, χρησιμοποιήστε τη συνάρτηση GetRegString

Παράδειγμα:

Δοκιμή Dim As String test = GetRegString(HKEY_LOCAL_MACHINE, _ "Software\Microsoft\DirectX", "Version") Form1.Caption = δοκιμή

Για να διαβάσετε μια παράμετρο GetRegDWord DWORD

Παράδειγμα:

Δοκιμή Dim As Long Test = GetRegDWord(HKEY_LOCAL_MACHINE, _ "Software\Microsoft\Internet Explorer\AboutURLs", "Home") Form1.Caption = δοκιμή

Το SetRegString χρησιμοποιείται για να γράψει μια παράμετρο συμβολοσειράς

Παράδειγμα:

SetRegString HKEY_LOCAL_MACHINE, _ "Software\test", "MyProgram", "Options"

Εάν το κλειδί ή η παράμετρος δεν έχει δημιουργηθεί, τότε θα δημιουργηθούν, εάν το κλειδί ή η παράμετρος υπάρχει ήδη, τότε οι νέες τιμές θα αντικαταστήσουν τις παλιές.

Για να γράψετε μια παράμετρο DWORD, χρησιμοποιήστε το SetRegDWord

Παράδειγμα:

SetRegDWord HKEY_LOCAL_MACHINE, _ "Software\test", "MyProgram", "555"

Για να διαγράψετε ένα κλειδί από το μητρώο, χρησιμοποιήστε τη συνάρτηση DeleteRegKey.

Παράδειγμα:

DeleteRegKey HKEY_LOCAL_MACHINE, "Software", "test", True

Η δεύτερη παράμετρος είναι το γονικό κλειδί.
Η τρίτη παράμετρος είναι True εάν απαιτείται επιβεβαίωση για τη διαγραφή ή False εάν δεν απαιτείται επιβεβαίωση.

Για να διαγράψετε μια παράμετρο από το μητρώο, χρησιμοποιήστε τη συνάρτηση DeleteRegValue

Παράδειγμα:

DeleteRegValue HKEY_LOCAL_MACHINE,_ "Software\Microsoft\Internet Explorer\AboutURLs", "mozilla", False

Στην πραγματικότητα, οι δυνατότητες του API λειτουργούν σε λειτουργικό σύστημαΤα Windows είναι πρακτικά απεριόριστα. Ας ολοκληρώσουμε αυτήν την ανασκόπηση αυτής της δυνατότητας της Visual Basic και τέλος ας γράψουμε ένα μικρό πρόγραμμα χρησιμοποιώντας συναρτήσεις API.

Αυτό το πρόγραμμα απλώς εμφανίζει ένα μήνυμα στην οθόνη, επικολλήστε τον ακόλουθο κώδικα:

Ιδιωτική Δήλωση Συνάρτησης BeginPath Lib "gdi32" (ByVal hdc για όσο χρονικό διάστημα) Για όσο διάστημα Ιδιωτική δήλωση συνάρτησης EndPath Lib "gdi32" (ByVal hdc όσο) Συνάρτηση SetWindowRgn Lib "user32" (ByVal hWnd As Long, ByVal hRgn As Long, ByVal bRedraw As Boolean) As Long Private Sub Form_Load() Const TEXT = "Χρησιμοποιήσατε το API" Dim hRgn As Long Romans "time. " Font.Bold = True Font.Size = 60 Width = TextWidth(TEXT) Height = TextHeight(TEXT) BeginPath hdc Εκτύπωση TEXT EndPath hdc hRgn = PathToRegion(hdc) SetWindowRgn hWndS, -Fal.Widseh 2 , (Screen.Height - Height) / 2 End Sub

Χρησιμοποιήσαμε εδώ 4 συναρτήσεις (BeginPath, EndPath, PathToRegion, SetWindowRgn), οι οποίες βρίσκονται σε δύο βιβλιοθήκες dll (gdi32, user32).

Αυτα για τωρα!

Το API (από το English Application Program Interface) είναι μια διεπαφή για την αλληλεπίδραση μεταξύ της τοποθεσίας πελάτη και του διακομιστή. Αντιπροσωπεύει έναν πόρο που ανοίγει ο διακομιστής για εργασία από έξω, π.χ. ένας προγραμματιστής μπορεί να το χρησιμοποιήσει για να αποκτήσει πρόσβαση στη λειτουργικότητα ενός προγράμματος, βιβλιοθήκης, λειτουργικής μονάδας. Το API καθιστά δυνατή την εργασία με πόρους που χρησιμοποιούν τις δυνατότητες και την ισχύ του ιστότοπου παροχής, καθώς και την εκκίνηση πρόσθετων στοιχείων για αυτούς που επεκτείνουν τις δυνατότητες του έργου web.

Πλεονεκτήματα:

Τύποι

  • επιστρέφοντας. Κατόπιν αίτησης εφαρμογή τρίτωνοποιαδήποτε μέθοδος με δεδομένες παραμέτρους, ο διακομιστής δίνει τις ζητούμενες πληροφορίες σε μια συγκεκριμένη μορφή.
  • αλλάζει. Ο πελάτης καλεί κάποια λειτουργία διακομιστή που εισάγει νέες πληροφορίες ή αλλάζει ορισμένες ρυθμίσεις σε αυτήν.

Yandex.Direct API

Το API είναι αποτελεσματικό για την προώθηση ιστότοπου.

  1. Με βάση αυτό, οι προγραμματιστές μπορούν να δημιουργήσουν εφαρμογές που αλληλεπιδρούν άμεσα με την υπηρεσία της μηχανής αναζήτησης. Τέτοια προγράμματα θα επιτρέπουν στους διαφημιστές να διαχειρίζονται ευέλικτα καμπάνιες μεγάλης κλίμακας, να λαμβάνουν στατιστικές αναφορές για καθεμία από αυτές και να προβλέπουν με ακρίβεια τους προϋπολογισμούς.
  2. Οι διαφημιστικές εταιρείες που χρησιμοποιούν Direct API μπορούν να προβάλουν ολόκληρη τη λίστα των πελατών τους, πελατών - εκπροσώπων.
  3. Εάν ορισμένες φράσεις που χρησιμοποιούνται για τη βελτιστοποίηση μηχανών αναζήτησης δίνουν χαμηλό CTR στη διαφήμιση με βάση τα συμφραζόμενα, μπορούν να απενεργοποιηθούν αυτόματα. Σε θεματικούς ιστότοπους, μπορείτε να ορίσετε τιμές μέσω του API, ορισμένοι δωρητές μπορούν να διαγραφούν.
  4. Το Yandex.Direct API διαθέτει διεπαφή SOAP, που σημαίνει ότι παρέχει ένα ευρύ φάσμα γλωσσών προγραμματισμού για τη δημιουργία εφαρμογών. Αυτό το πρωτόκολλο υποστηρίζεται από γλώσσες όπως Perl, Java,