Δευτέρα 7 Μαρτίου 2016

Αναθεώρηση 181 και C Calls

Σε αυτήν την αναθεώρηση, τελείωσα μια εκκρεμότητα που είχα αφήσει πολύ καιρό. H M2000 μπορεί να κάνει stdCalls δηλαδή κλήσεις σε ρουτίνες του λειτουργικού (αν και προς το παρόν δεν μπορεί να περάσει structs, και εκεί έχω εκκρεμότητα). Τώρα πρόσθεσα τα C Calls δηλαδή κλήσεις σε dll που έχουν γραφεί με C.

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

Στο παράδειγμα καλούμε την εντολή (συνάρτηση) της C την swprintf μιας συνάρτησης που επιστρέφει ένα νούμερο (Α) το οποίο δηλώνει πόσοι χαρακτήρες έχουν χρησιμοποιηθεί από το αλφαριθμητικό mybuf$ που περνάμε με αναφορά (by reference).
Στον ορισμό έχω δηλώσει ότι θα πάρει λίστα παραμέτρων (και αυτό σε αυτήν την αναθεώρηση το έφτιαξα).
Υπάρχει θέμα με τις κλήσεις σε C. Αν δεν γίνουν σωστά τότε έχουμε άμεσα λάθος ανεπανόρθωτο, ή fatal error. Δηλαδή δεν διορθώνει η κατάσταση, το πρόγραμμα διακόπτει την λειτουργία του!
Δείτε ότι στο P2 λέμε ότι θα δώσουμε d που σημαίνει Long, Μακρύς,  Αν δώσουμε πραγματικό  (double) τότε θα έχουμε fatal error. Για το σκοπό αυτό έφτιαξα στη Μ2000 να περνάμε στο σωρό ακέραιες τιμές άμεσα και όταν τις διαβάζει η κλήση εξωτερικής ρουτίνας να ξέρει ότι θα βάλει την τιμή σε ένα μακρύ (32 Bit).

Μπορούμε να ορίσουμε Γενικό
Όρισε Γενικό MyPrint Από C "msvcrt.swprintf" { &sBuf$, sFmt$, ... }
Κανονική μορφή όπου το 0 δηλώνει ότι θα επιστρέφει Μακρύ.
Όρισε Γενικό MyPrint Από C "msvcrt.swprintf" { &sBuf$, sFmt$, ... } ως 0



mybuf$=επαν$(χαρ$(0), 1000)
\\ Αν ορίσουμε συνάρτηση με το C πριν, τότε λέμε ότι είναι κλήση τύπου C
\\  το σύμβολο ... δηλώνει λίστα παραμέτρων. Ισχύει μόνο για το τελευταίο στοιχείο.
\\ μόνο Unicode κλήσεις για C.
Όρισε MyPrint Από C "msvcrt.swprintf" { &sBuf$, sFmt$, ... }
\\ το σύμβολο ! πριν από μια αριθμητική έκφραση για παράμετρο...
\\........λέει στον διερμηνευτή ότι θα καταχωρηθεί ως Μακρύς ή Long.
Α=MyPrint(&myBuf$, "Γειά P1=%s, P2=%d, P3=%.4f, P4=%s", "ABC", !123456, 1.23456, "xyz")
Τύπωσε Αρισ$(myBuf$,Α)




Και εδώ είναι κανονική κλήση στο λειτουργικό:

Όρισε μήνυμα Από "user32.MessageBoxW" {Μακρυς Α, κειμενο$, κειμενο2$, Μακρυς τυπος}
Τυπωσε μήνυμα(Παραθυρο, "Γεια χαρά", "Γιώργος", 2)


Η Παράθυρο είναι το hWnd ή ο handler του παραθύρου της Μ2000, και το δίνουμε για να είναι πάντα το μήνυμα μπροστά από το παράθυρο, μπροστά από την φόρμα της Μ2000.

Μπορεί κανείς να φτιάξει με όποια γλώσσα θέλει ένα COM αντικείμενο και μπορεί η Μ2000 να το προσπελάσει:
Έφτιαξα σε VB6 μια κλάση Class1 με μια μόνο συνάρτηση σε ένα Dll με όνομα project Mydll. To αποθήκευσα ως Checkme.dll. Η Vb6 το καταχώρησε στη Registry των Windows.

Function CheckMe(A As Double, B As Double) As Double
CheckMe = (A + B) / 2
End Function


Για να τρέξω τη συνάρτηση πρέπει να ορίσω ένα αντικείμενο, με το όνομα Mydll και από αυτό τη κλάση που με ενδιαφέρει, την Class1. (Το Mydll θα μπορούσε να είχε και άλλες κλάσεις). Από αυτό το αντικείμενο καλώ μια μέθοδο, την CheckMe (είναι η συνάρτηση που βλέπουμε παραπάνω). Αφού την χρησιμοποιήσω τρεις φορές την εξαφανίζω!

Όρισε Γενικό alfa "mydll.class1"
Συνάρτηση CheckMe {
      Διάβασε K, L
      Μέθοδος alfa, "checkme", K, L ως A
      =A
}
Τύπωσε CheckMe(1000,500)
Τύπωσε CheckMe(1500,500)
Τύπωσε CheckMe(2000,500)
Όρισε alfa Τίποτα

Δεν υπάρχουν σχόλια:

Δημοσίευση σχολίου

You can feel free to write any suggestion, or idea on the subject.