Χρήση διεπαφών στους delphi. Δημιουργία διεπαφής χρήστη. Τυπικά στοιχεία διεπαφής

Ο αντικειμενοστραφής προγραμματισμός (OOP), εκτός από την έννοια της κλάσης, προβλέπει και τη θεμελιώδη έννοια της διεπαφής.

Τι είναι η διεπαφή και ποια είναι τα χαρακτηριστικά της εργασίας μαζί της στη γλώσσα προγραμματισμού Delphi;

Η διασύνδεση είναι μια σημασιολογική και συντακτική κατασκευή στον κώδικα προγράμματος που χρησιμοποιείται για τον καθορισμό των υπηρεσιών που παρέχονται από μια κλάση ή στοιχείο (Wikipedia).

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

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

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

Για να δηλώσετε μια διεπαφή στους Δελφούς, χρησιμοποιήστε τη λέξη-κλειδί διεπαφής. Αυτή είναι η ίδια λέξη-κλειδί που ορίζει την ενότητα της ενότητας στην οποία είναι δυνατή η πρόσβαση από έξω (μεταξύ της διεπαφής και των λέξεων-κλειδιών υλοποίησης). Ωστόσο, κατά τη δήλωση μιας διεπαφής, χρησιμοποιείται διαφορετική σύνταξη, παρόμοια με τη δήλωση κλάσεων.

Δελφοί/Πασκάλ

IMyNewInterface = διαδικασία διεπαφής InterfaceProc;

τέλος;

IMyNewInterface =διεπαφή

διαδικασία InterfaceProc ;

τέλος ;

Το γεγονός είναι ότι οι διεπαφές Delphi εισήχθησαν αρχικά για να υποστηρίζουν την τεχνολογία COM. Επομένως, η διεπαφή IInterface, η οποία στους Δελφούς είναι ο πρόγονος για όλες τις άλλες διεπαφές (ένα είδος αναλόγου του TObject), περιέχει ήδη τρεις βασικές μεθόδους εργασίας με αυτήν την τεχνολογία: QueryInterface, _AddRef, _Release. Ως αποτέλεσμα, εάν μια κλάση υλοποιεί οποιαδήποτε διεπαφή, τότε πρέπει επίσης να εφαρμόσει αυτές τις μεθόδους. Ακόμα κι αν αυτή η κλάση δεν προορίζεται για εργασία COM.

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

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

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

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

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

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

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

  1. Το πρόγραμμα θα πρέπει να βοηθήσει στην ολοκλήρωση μιας εργασίας και όχι να γίνει αυτή η εργασία.
  2. Όταν εργάζεστε με το πρόγραμμα, ο χρήστης δεν πρέπει να αισθάνεται σαν ανόητος.
  3. Το πρόγραμμα θα πρέπει να λειτουργεί με τέτοιο τρόπο ώστε ο χρήστης να μην θεωρεί τον υπολογιστή ανόητο.
Πρώτη αρχή- αυτή είναι η λεγόμενη «διαφάνεια» της διεπαφής. Η διεπαφή χρήστη θα πρέπει να είναι διαισθητική, εύκολη στην εκμάθηση και να μην δημιουργεί προβλήματα στον χρήστη που θα πρέπει να ξεπεράσει κατά τη διαδικασία της εργασίας. Χρησιμοποιήστε τυπικά εξαρτήματα χωρίς περιττό στολισμό, χρησιμοποιήστε γνωστές τεχνικές ελέγχου που χρησιμοποιούνται από παρόμοια προγράμματα και θα επιτύχετε τα κριτήρια απόδοσης πρώτη αρχή.

Δεύτερη αρχήείναι η παραμέληση των πνευματικών ικανοτήτων των χρηστών. Από τη δική μου εμπειρία, γνωρίζω ότι συχνά οι χρήστες όχι μόνο δεν ξέρουν πώς να δουλεύουν σε υπολογιστή, αλλά απλώς φοβούνται να κάνουν οτιδήποτε μόνοι τους. Επομένως, η διεπαφή χρήστη θα πρέπει να είναι όσο το δυνατόν πιο φιλική.
Επιπλέον, οι φόβοι των χρηστών είναι συχνά δικαιολογημένοι, επειδή το κόστος του προγράμματος, ακόμη και του ίδιου του υπολογιστή, δεν μπορεί να συγκριθεί με το κόστος, για παράδειγμα, μιας βάσης δεδομένων που δημιουργήθηκε μετά από πολλά χρόνια προσπάθειας. Αυτός είναι ο λόγος για τον οποίο, κατά τη δημιουργία μιας διεπαφής χρήστη, ένας προγραμματιστής πρέπει πάντα να ενσωματώνει «αδιάκριτη προστασία» στο πρόγραμμα - έναντι εσφαλμένων ενεργειών και εισαγωγής εσφαλμένων δεδομένων από τον χρήστη. Αλλά ορισμένοι προγραμματιστές παρασύρονται πολύ με τέτοια προστασία, την κάνουν πολύ παρεμβατική και ως αποτέλεσμα, η λειτουργία του προγράμματος μοιάζει με το περίφημο «ένα βήμα προς τα αριστερά, ένα βήμα προς τα δεξιά θεωρείται διαφυγή»! Και αυτό που δημιουργεί ο προγραμματιστής ως λύση σε ένα πρόβλημα αρχίζει να δημιουργεί προβλήματα ο ίδιος.
Να συμμορφωθούν δεύτερη αρχήδεν χρειάζεται να επιτρέψετε στο πρόγραμμα να «διορθώσει» τις ενέργειες του χρήστη και να υποδείξει ακριβώς πώς πρέπει να ενεργήσει, αναγκάζοντάς τον σε ένα στενό πλαίσιο. Επίσης, δεν πρέπει να παρασυρθείτε πολύ με την εμφάνιση ενημερωτικών μηνυμάτων προτροπής, ειδικά των μηνυμάτων διαλόγου, καθώς αυτό αποσπά την προσοχή του χρήστη από την εργασία. Θα ήταν καλύτερο να παρέχετε τη δυνατότητα να απενεργοποιήσετε εντελώς τις συμβουλές.

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

Προσπαθήστε να τηρείτε τους ακόλουθους κανόνες:

Τυπικά στοιχεία διεπαφής
Χρησιμοποιήστε στοιχεία που είναι τυπικά για αυτό το στοιχείο διεπαφής. Έχοντας συναντήσει το πρόγραμμά σας, ο χρήστης δεν θα χάσει χρόνο για να γνωρίσει ο ένας τον άλλον, αλλά θα αρχίσει αμέσως να εργάζεται - αυτό είναι ένα από τα σημάδια ενός επαγγελματικά κατασκευασμένου προγράμματος.
Μικρή παλέτα εργαλείων
Προσπαθήστε να μην χρησιμοποιείτε πάρα πολλά διαφορετικά εξαρτήματα. Και φυσικά, έχοντας χρησιμοποιήσει ένα τυπικό εξάρτημα κάπου σε ένα μέρος, σε παρόμοια περίπτωση χρησιμοποιήστε το επίσης.
Ίση απόσταση μεταξύ των χειριστηρίων
Τοποθετήστε τα στοιχεία διεπαφής στην ίδια απόσταση μεταξύ τους. Τα εξαρτήματα που είναι διάσπαρτα δημιουργούν την αίσθηση ενός αντιεπαγγελματικού προϊόντος. Και αντίστροφα, η προσεκτικά επαληθευμένη τοποθέτηση κουμπιών, διακοπτών, πλαισίων ελέγχου και άλλων στοιχείων που συνθέτουν τη διεπαφή στη Φόρμα αποτελεί ένδειξη εργασίας υψηλής ποιότητας.
TabOrder. «Σωστή» σειρά
TabOrderείναι η σειρά με την οποία ο κέρσορας της οθόνης μετακινείται στα χειριστήρια όταν πατηθεί ένα πλήκτρο Αυτί. Σε ένα σωστά γραμμένο πρόγραμμα, ο κέρσορας κινείται ακολουθώντας τη λογική της εργασίας του χρήστη με το πρόγραμμα. Κατά τη δημιουργία ενός προγράμματος, ο προγραμματιστής συχνά αλλάζει στοιχεία, αφαιρεί ορισμένα και προσθέτει άλλα ανάλογα με τις ανάγκες. Ως αποτέλεσμα, στο ολοκληρωμένο πρόγραμμα ο δρομέας πηδά χαοτικά γύρω από τη Φόρμα. Αφού ολοκληρώσετε το πρόγραμμα, μην ξεχάσετε να ρυθμίσετε τις παραμέτρους TabOrder.
Επιλογή γραμματοσειράς
Απλώς αφήστε τις γραμματοσειρές ήσυχες. Οι προεπιλεγμένες γραμματοσειρές του Delphi είναι κατάλληλες για οποιοδήποτε σύστημα στο οποίο μπορεί να εκτελείται το πρόγραμμά σας. Χρησιμοποιήστε έντονη γραμματοσειρά μόνο για να επισημάνετε σημαντικά στοιχεία. Εφαρμογή κυρτά γράμματακαι ειδικά υπογραμμίζοντας, το οποίο ο χρήστης μπορεί να μπερδέψει ως υπερσύνδεσμο είναι κακής μορφής.
Επιλογή χρωμάτων
Όσον αφορά τα χρώματα των στοιχείων της διεπαφής, όπως και στην περίπτωση των γραμματοσειρών, είναι προτιμότερο να τα αφήνετε στάνταρ, από προεπιλογή. Το Delphi χρησιμοποιεί την παλέτα συστήματος των Windows και ο χρήστης μπορεί εύκολα να προσαρμόσει τα χρώματα αλλάζοντας την.
Εναλλακτική διαχείριση
Ένα επαγγελματικά κατασκευασμένο πρόγραμμα θα πρέπει να μπορεί να ελέγχεται όχι μόνο με το ποντίκι, αλλά και με το πληκτρολόγιο. Δεν πρέπει να υπάρχουν λειτουργίες που μπορούν να εκτελεστούν μόνο με το ποντίκι (η σχεδίαση σε προγράμματα επεξεργασίας γραφικών δεν μετράει!). Για τις πιο χρησιμοποιούμενες λειτουργίες, θα πρέπει να παρέχετε "πλήκτρα συντόμευσης" για γρήγορη πρόσβαση.
Τούβλα διεπαφής
Όσον αφορά συγκεκριμένα στοιχεία της διεπαφής χρήστη, η ποιότητα της αλληλεπίδρασης του χρήστη με το πρόγραμμα εξαρτάται από:
  • συμμόρφωση του στοιχείου ελέγχου με την εργασία που εκτελεί·
  • κανόνες με τους οποίους λειτουργεί το στοιχείο ελέγχου.
    Αυτή η σελίδα εξετάζει τους κανόνες για τη δημιουργία ορισμένων στοιχείων διεπαφής.
Και τώρα θέλω να δείξω ποια εργαλεία προσφέρει η Delphi για τη διαχείριση στοιχείων στη Φόρμα, τη σχετική τους θέση και τη συμπεριφορά του δρομέα όταν πατιέται ένα πλήκτρο Αυτί.

Για να τακτοποιήσετε τα στοιχεία μεταξύ τους με τη σωστή σειρά, πρώτα είναι απαραίτητο να τα αναδείξουμε. Μπορείτε απλώς να κυκλώσετε την περιοχή στη Φόρμα που περιέχει τα επιλεγμένα στοιχεία. Ή κρατώντας το " Αλλαγή", χρησιμοποιήστε το ίδιο ποντίκι για να υποδείξετε κάθε στοιχείο που θέλετε να επιλέξετε. Κάντε ξανά κλικ με το ποντίκι στο επιλεγμένο στοιχείο (ενώ πατάτε το " Αλλαγή") το αποεπιλέγει.

Τα επιλεγμένα στοιχεία μπορούν να διαχειρίζονται ως ένα ενιαίο σύνολο - μετακινούνται γύρω από τη Φόρμα, εκχωρούνται τιμές στις ίδιες ιδιότητες, αντιγράφονται (για εγκατάσταση, για παράδειγμα, σε άλλη Φόρμα), ακόμη και διαγράφονται.

Τώρα κάντε δεξί κλικ σε ένα από τα στοιχεία και επιλέξτε από το αναδυόμενο μενού Θέση -> Ευθυγράμμιση...Θα εμφανιστεί ένα παράθυρο διαλόγου που σας επιτρέπει να προσαρμόσετε την οριζόντια και κάθετη θέση των στοιχείων στην ομάδα. Για παράδειγμα, πρέπει να ευθυγραμμίσουμε τα τέσσερα κουμπιά μας προς τα αριστερά και να βεβαιωθούμε ότι έχουν την ίδια κάθετη απόσταση μεταξύ τους. Για να το κάνετε αυτό, επιλέξτε τα κουμπιά επιλογής Οριζόντια: Αριστερές πλευρέςΚαι Κατακόρυφη: Διαστήστε ίσα.

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

Στην ίδια γραμμή μενού Αυτί Οπαραγγείλετε...προκαλεί την εμφάνιση ενός πλαισίου διαλόγου που ελέγχει τον τρόπο με τον οποίο ο κέρσορας κινείται στα στοιχεία της διεπαφής όταν πατηθεί ένα πλήκτρο Αυτί. Όταν εμφανίζεται η Φόρμα στην οθόνη, ο κέρσορας θα βρίσκεται φυσικά στο στοιχείο που βρίσκεται στην πρώτη γραμμή του πλαισίου διαλόγου. Και μετά θα μετακινηθεί προς τα κάτω στη λίστα. Στο παράθυρο διαλόγου, δύο μπλε βέλη πάνω και κάτω ελέγχουν τη θέση του επιλεγμένου στοιχείου. Επιλέξτε το απαιτούμενο στοιχείο, χρησιμοποιήστε τα βέλη για να το μετακινήσετε στην επιθυμητή γραμμή στη λίστα και ούτω καθεξής.

Όταν επιλέγετε ένα στοιχείο μενού Έλεγχος ->Εμφανίζεται ένα υπομενού που αποτελείται από δύο στοιχεία:

  • Φέρτε μπροστά
  • Αποστολή στην Πίσω
Αυτές είναι μέθοδοι στοιχείων που είναι επίσης διαθέσιμες μέσω προγραμματισμού. Button1.SendToBackμετακινεί το κουμπί στο "φόντο" και Button1.BringToFront- στο «πρώτο πλάνο». Δηλαδή, εάν ένα στοιχείο είναι τοποθετημένο πάνω από ένα άλλο, αυτές οι μέθοδοι ανταλλάσσουν τις θέσεις τους. Οι περιπτώσεις στις οποίες αυτό μπορεί να ισχύει είναι αρκετά προφανείς.

Έχω ένα πρόβλημα με τη χρήση μιας κλάσης Delphi από τον κώδικα C++. demo delphi dll, η οποία εξάγει μια συνάρτηση που επιστρέφει ένα αντικείμενο.
Ο κώδικας μου Delphi Dll μοιάζει με αυτό:

Βιβλιοθήκη DelphiTest; // χρησιμοποιεί τμήμα.... τύπος IMyObject = διαδικασία διεπαφής DoThis(n: Integer); συνάρτηση DoThat: PWideChar; τέλος; Διαδικασία TMyObject = class(TInterfacedObject,IMyObject) DoThis(n: Integer); λειτουργία DoThat: PChar; τέλος; // Υλοποίηση TMyObject πηγαίνετε εδώ ... διαδικασία TMyObject.DoThis(n: Integer); start showmessage("καλείτε τη μέθοδο DoThis με "+intToStr(n) +"παράμετρο"); τέλος; συνάρτηση TMyObject.DoThat: PChar; start showmessage("καλείτε τη συνάρτηση DoThat"); Αποτέλεσμα:= Pchar("Hello im Dothat"); τέλος;

// εξαγωγή συνάρτησης DLL:

Λειτουργία CreateMyObject: IMyObject; stdcall;εξαγωγή; var txt: TextFile; start AssignFile(txt,"C:\log.log"); Επαναφορά (txt); Writeln(txt,"γεια"); Αποτέλεσμα:= TMyObject.Create; τέλος; εξαγωγές CreateMyObject;

στο έργο μου C++ δήλωσα τη διεπαφή IMyObject ως εξής:

Κλάση IMyObject ( δημόσιο: IMyObject(); εικονικό ~IMyObject(); εικονικό κενό DoThis(int n) = 0; εικονικό χαρακτήρα* DoThat() = 0; );

και η βασική μου λειτουργία είναι η εξής:

Typedef IMyObject* (__stdcall *CreateFn)(); int main() ( HMODULE hLib; hLib = LoadLibrary(L"DelphiTest.dll"); assert(hLib != NULL); // pass !! CreateFn pfnCreate; pfnCreate = (CreateFn)GetProcAddress((HINSTANatey "b)C "); if (pfnCreate == NULL) ( DWORD erc = GetLastError(); printf("%u\n", erc); // εμφανίζεται σφάλμα 127 ) else( printf("επιτυχής φόρτωση\n"); ) IMyObject* objptr = pfnCreate( objptr->DoThis (5) ;

Σε αυτό το παράδειγμα, έλαβα ένα σφάλμα χρόνου εκτέλεσης όταν προσπαθώ να αποκτήσω πρόσβαση στη συνάρτηση εξαγωγής. λάθη στη γραμμή:
IMyObject* objptr = pfnCreate();

Μπορείτε να μου πείτε τι συμβαίνει με το παράδειγμά μου.
και αν είναι δυνατόν, οποιοδήποτε παράδειγμα εργασίας για πρόσβαση σε μια κλάση Delphi (σε DLL) από κώδικα C++.

Διάλυμα

Το πρώτο πρόβλημα είναι η κλήση της μεθόδου σύμβασης. Η διεπαφή Delphi χρησιμοποιεί καταχωρητή που είναι μια ειδική σύμβαση κλήσης των Delphi. χρήση του stdcall Για παράδειγμα, για μεθόδους διεπαφής.

Το επόμενο πρόβλημα είναι στη C++. Η διεπαφή C++ πρέπει να προέρχεται από το IUnknown Επιπλέον, δεν πρέπει να δηλώνει κατασκευαστή ή καταστροφέα.

Εκτός από αυτό, ο κωδικός σας Delphi εξάγεται από το PWideChar ο οποίος δεν έχει αντιστοιχιστεί σε char*.

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

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

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

Αυτό είναι ένα άρθρο που βασίζεται σε ερωτήσεις στα φόρουμ: "Πώς μπορώ να επιστρέψω μια συμβολοσειρά από ένα DLL;", "Πώς να περάσω και να επιστρέψω μια σειρά εγγραφών;", "Πώς να περάσω μια φόρμα σε ένα DLL;".

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

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

Σημαντική Σημείωση: το άρθρο πρέπει να διαβαστεί διαδοχικά. Τα παραδείγματα κώδικα παρέχονται μόνο ως παραδείγματα, σε κάθε βήμα (σημείο) του άρθρου, προστίθεται ο κώδικας του παραδείγματος με νέες λεπτομέρειες. Για παράδειγμα, στην αρχή του άρθρου δεν υποδεικνύονται «κλασικές» μέθοδοι (όπως η χρήση του GetLastError , η σύμβαση sdtcall, κ.λπ.), οι οποίες αντικαθίστανται με πιο κατάλληλες καθώς προχωρά το άρθρο. Αυτό έγινε έτσι ώστε τα «νέα» («ασυνήθιστα») σχέδια να μην εγείρουν ερωτήματα. Διαφορετικά, θα ήταν απαραίτητο να εισαγάγετε μια σημείωση για κάθε παράδειγμα όπως: "αυτό συζητείται σε αυτήν την παράγραφο παρακάτω, αλλά αυτό συζητείται σε αυτήν την παράγραφο." Σε κάθε περίπτωση, στο τέλος του άρθρου υπάρχει σύνδεσμος για έτοιμο κώδικα, γραμμένο λαμβάνοντας υπόψη όλα όσα αναφέρονται στο άρθρο. Μπορείτε απλά να το πάρετε και να το χρησιμοποιήσετε. Και το άρθρο εξηγεί γιατί και γιατί. Εάν δεν σας ενδιαφέρει το "γιατί και γιατί", μετακινηθείτε στο τέλος στο συμπέρασμα και στον σύνδεσμο για να κατεβάσετε το παράδειγμα.