Ce este API în cuvinte simple. API: ce este - descriere și tipuri de API. API-urile ușurează viața dezvoltatorilor



API - ce este? Decodare, definire, traducere

API este o abreviere în engleză, care înseamnă A aplicarea P programarea eu ninterface - „Interfață de programare a aplicației”. De obicei, un API este un set de funcții convenabile care vă permit să accesați un serviciu și să solicitați date de la acesta. În engleză, această abreviere se pronunță „hey-pi-ay”, dar programatorii vorbitori de limbă rusă nu își complică inutil viața și spun „ápi”.

Un exemplu clasic de API este Yandex.maps: orice programator sau webmaster mai mult sau mai puțin experimentat poate plasa o hartă Yandex a oricărui oraș sau sat cu setările de care are nevoie pe site-ul său, folosind funcții API convenabile, care, apropo, sunt furnizate de Yandex complet gratuit și includ aproape întregul set de setări ale hărților disponibile utilizatorilor site-ului web Yandex.Maps.




Ai aflat de unde vine cuvântul? API, explicația sa în cuvinte simple, traducere, origine și sens.

API(Engleză) interfața de programare a aplicației) - aceasta este interfața de programare a aplicației. API-ul unei anumite aplicații sau serviciu oferă un set de proceduri, funcții și variabile gata făcute cu care dezvoltatorii terți își pot crea propriile aplicații și scripturi pentru a lucra cu acest serviciu.

Când lucrează printr-un API, o aplicație trimite o solicitare unui serviciu și primește un răspuns care conține datele solicitate, indiferent de limbajul de programare în care a fost creată.

Proprietarii de magazine online, care folosesc servicii terțe și aplicații proprii, au posibilitatea de a accesa prin API:

Informații despre comenzile plasate

Acțiuni (metode) disponibile pentru procesarea informațiilor despre comandă:

  1. Selectarea informațiilor despre comandă după ID
  2. Selectarea informațiilor despre comandă prin filtru
  3. Numărul de comenzi după filtru
  4. Creați o comandă
  5. Ștergerea unei comenzi
  6. Ștergerea în masă a comenzilor
  7. Selectarea tuturor stărilor disponibile pentru comenzi
  8. Actualizați starea comenzii
  9. Adăugarea unui comentariu la o comandă

Informații despre abonat

  1. Adăugarea unui abonat
  2. Ștergeți un abonat
  3. Ștergerea în masă a abonaților
  4. Selectarea datelor abonaților prin filtru
  5. Numărul de abonați după filtru

Informații despre utilizatorii înregistrați

Acțiuni (metode) disponibile pentru procesarea informațiilor despre abonați:

  1. Selectarea informațiilor despre utilizatorii înregistrați după ID
  2. Selectarea informațiilor despre toți utilizatorii înregistrați
  3. Selectarea informațiilor despre toate datele specificate de utilizator în timpul înregistrării:
    • Numele complet;
    • Adresa email de contact;
    • Numar de telefon de contact;
    • Adresa de livrare specificată: cod poștal, denumirea localității, denumirea străzii, numărul casei, numărul imobilului, numărul apartamentului, etaj;

Notă! La înregistrare, este posibil ca utilizatorul să nu completeze toate câmpurile de mai sus.

Planuri de dezvoltare API

În viitorul apropiat, intenționăm să deschidem interfețe pentru a sprijini interacțiunea magazinelor cu aplicații și servicii terțe pentru lucrul cu:

  1. Secțiuni de catalog.
  2. Bunuri.
  3. Un coș.
  4. Reduceri.
  5. Metode de livrare.
  6. Metode de plata.

Pentru a testa interacțiunea cu API-ul platformei beseller, a fost creat un magazin de teste beseller-api.shop.by.

Pentru a accesa magazinul de testare, trebuie să furnizați o autentificare și o parolă. Le puteți obține la cerere de la managerul dumneavoastră personal.

Înainte de a testa interacțiunea cu API-ul, vă recomandăm să:

  1. plasați singur mai multe comenzi;
  2. abonați-vă la newsletter;
  3. vezi cum sunt afișate informațiile despre comenzile plasate și despre abonați în panoul de administrare a magazinului.

Panoul de control al magazinului este disponibil la: beseller-api.shop.by/manager/. Autentificarea și parola la intrarea în panoul de control sunt similare cu autentificarea și parola pentru accesarea magazinului.

Cum să vă conectați prin API la magazinul dvs.?

Pentru a conecta aplicația cu magazinul dvs., trebuie să specificați o adresă URL de acces API cu formularul:

http://your_site_address:8082/graphql?token=your_personal_secret_key

Puteți obține cheia secretă la cererea managerului dvs. personal.

Funcții și variabile GraphQL pentru lucrul cu API-ul platformei beseller

Cum să vă conectați la un API folosind limbajul de programare PHP

Pentru a facilita lucrul cu API-ul platformei beseller, puteți utiliza:

  1. Cursuri dezvoltate de noi pentru PHP.
    1. GraphqlClient- primeste si transmite date catre server;
    2. GraphQlHelper- conține API-uri de interogare și mutație implementate;
  2. Exemple de utilizare a claselor pentru a face selecții și modificări în baza de date a magazinului online.

Configurarea mediului local

Pentru a demonstra în mod clar trimiterea solicitărilor către API și răspunsurile primite, puteți utiliza mediul local.

GraphiQL Feen este folosit ca mediu local, aceasta este o extensie pentru browserul Google Chrome care vă permite să generați solicitări către API.

După instalarea aplicației, o pictogramă a aplicației va apărea în browserul dvs. lângă bara de adrese.

Deschideți aplicația GraphiQL Feen și accesați fila „SERVERE”, selectați metoda de trimitere POST, apoi specificați adresa URL de acces API.

Următoarea adresă ar trebui utilizată ca adresă URL de testare:

Mediul local este configurat, puteți genera cereri către API. Pentru a face acest lucru, trebuie să deschideți fila „INTREBĂRI”.

Formarea unei cereri către API-ul beseller folosind GraphiQL Feen și răspunsul primit

Explicații pentru captură de ecran:

  1. Interogări salvate
  2. Câmp pentru introducerea cererilor
  3. Câmp de intrare variabil
  4. Răspuns primit
  5. Butonul de start

Un exemplu de cerere de obținere a unei liste de comenzi plasate pentru o perioadă de timp specificată

interogare ($first:Int, $offset:Int, $filter: OrdersFilterType)(
comenzi(primul:$primul, offset:$offset, filtru:$filtru)(
cometariu
stare(
id
Descriere
Nume
}
creeaza o data
data_actualizării
total (
sufix
valoare
}
plata (
Nume
Descriere
cost (
sufix
valoare
}
}
livrare (
Nume
Descriere
cost (
sufix
valoare
}
}
valute (
cod bancar
curs
sufix
}
datele utilizatorului(
Nume
Descriere
valoare
}
}
}

Specificarea perioadei de timp pentru preluarea datelor despre comenzile plasate

{
"filtru": (
"date_after": "2017-11-16T00:00:01Z",
„date_before”: „2017-11-23T00:00:01Z”
}
}

Exemplu de răspuns de la API

{{
"date": (
"Comenzi": [
{
"comment": "Culpa officiis vel ut.",
"create_date": "2017-11-22 16:23:28",
„monede”: [
{
"bank_code": "BYN",
"curs": 10000,
„sufix”: „frec”.
}
],
"livrare": (
„cost”: [
{
"sufix": "frecare",
„valoare”: 0
}
],
"description": "Curier",
"nume": "personalizat"
},
"plata": (
„cost”: [
{
"sufix": "frecare",
„valoare”: 0
}
],
"description": "Carti de plastic",
"nume": "personalizat"
},
"stare": (
"description": "Nou",
„id”: 1,
"nume": "nou"
},
"total": [
{
"sufix": "frecare",
„valoare”: 4450
}
],
"update_date": "2017-11-22 16:23:28",
"datele utilizatorului": [
{
"description": "Adresa de e-mail",
"nume": "e-mail",
"valoare": " [email protected]"
},
{
"description": "Telefon",
"nume": "telefon",
„valoare”: „784.392.3949 x69329”
},
{
"description": "Adresa",
"nume": "înregistrare",
„value”: „607 Erik Station Suite 057\nReynaberg, WY 83542-0037”
},
{
"description": "Comentariu",
"nume": "comentează",
"value": "Id nam illo optio."
},
{
"description": "Nume",
"nume": "fio",
„valoare”: „Dr. Jordi Mann”
}
]
}

Un API este o interfață externă pentru programarea unei aplicații, accesarea site-urilor folosind un protocol specific pentru obținerea de informații și dezvoltarea simplificată a programelor asociate serviciilor interne.

Ce înseamnă API?

Cea mai simplă analogie pentru utilizarea unui API ar fi folosirea unui calculator pentru a efectua calcule complexe. Să presupunem că aveți o sarcină, puteți înțelege esența ei, puteți construi ecuații și grafice, dar nu știți să efectuați operații aritmetice cu numere. Există un calculator lângă tine care poate face aceste operațiuni cu ușurință. Nu știi ce se întâmplă în interiorul computerului și nu trebuie să știi. Dați informații într-o formă și le primiți în alta, necesare scopurilor dumneavoastră.

Orice API funcționează pe acest principiu. Nu vă interesează cum primește programul răspunsul, ce cale urmează cererea în interiorul acestuia, cum sunt efectuate calculele. Sunteți sigur de un singur lucru - ca răspuns, se vor oferi informații standardizate despre succesul operațiunii sau despre eroarea acesteia.

Interfața API vă permite să nu vă pierdeți timpul, banii și efortul cumpărând o „bicicletă nouă”. Obțineți un port de informații de lucru care primește și trimite cantitățile necesare de date în scopul dezvoltării dvs.

Pro:

  • Economisiți la dezvoltarea propriei interfețe.
  • Nu este nevoie să înțelegeți nuanțele problemei.
  • API-urile sunt dezvoltate de profesioniști și iau în considerare toți factorii proceselor interne de care este posibil să nu fiți conștient atunci când vă creați soluția.
  • Vă permite să comunicați cu servicii care sunt închise prin alte protocoale.

Minusuri:

  • Dacă serviciul țintă este actualizat, API-ul nu primește întotdeauna imediat funcționalitatea completă.
  • Nu puteți detecta erori și nu știți cum funcționează procesul în codul altcuiva.
  • API-ul nu oferă întotdeauna cel mai optimizat rezultat în termeni de timp, deoarece este conceput pentru a gestiona cazuri generale, nu specifice.

Exemple API

Integrarea API este procesul de conectare a unei aplicații la o interfață de date externă. Lucrul cu API-ul începe cu studierea documentației și a protocoalelor utilizate și apoi integrarea directă a programului în interfață. Să ne uităm la cele mai populare servicii care au propriul API.

VKAPI

Interfață externă pentru interacțiunea rețelei sociale populare VKontakte cu clienții, precum și cu aplicațiile browser și server. Vă permite să gestionați mesajele comunității, coperțile grupurilor, paginile de utilizator dacă aveți cheile de acces adecvate.

Toate cererile se fac la adresa https://api.vk.com/method/

După slash vine numele metodei API utilizate și parametrii GET ai cererii sunt transmisi. Răspunsul vine și prin HTTPS în format JSON.

API-ul TELEGRAM BOT

Unul dintre cele mai populare API-uri. Este folosit pentru a controla boții în messengerul Telegram. După ce ați creat un bot prin @botfather și obțineți cheile de acces necesare, puteți începe să interacționați cu backend-ul.

Cererile se pot face la: https://api.telegram.org/bot0000000:token/

Unde bot0000000 este înlocuit cu identificatorul unic al botului tău, iar simbolul exprimă cheia secretă.

Solicitările sunt trimise prin conexiuni HTTPS, numele metodei este indicat cu o bară oblică către adresa principală. Răspunsul vine în format JSON.

Deschideți API-ul HARTĂ METEO

Este adesea necesar să obțineți informații despre vreme fără a utiliza widget-uri și aplicații plătite de la terți. Serviciul OpenWeatherMap vine în ajutor cu un API deschis și gratuit. După înregistrarea și primirea datelor de identificare, puteți trimite solicitări de vreme de la scripturi de server din întreaga lume. Ca răspuns la ID-ul orașului, resursa returnează cele mai detaliate informații despre vremea actuală și oferă o prognoză pentru viitorul apropiat.

Format: transmitere HTTP prin api.openweathermap.org/data/2.5/weather?id= indicând numărul de identificare al orașului dorit. Răspuns server: JSON.

API-ul GOOGLE MAPS

Ce poate fi mai frumos decât o hartă interactivă a lumii pe un site web? Mai ales dacă acesta nu este un șablon inserat din Google Maps, ci ediția dvs. personală a unei hărți populare cu grupuri personale de marcatori. Harta va interacționa cu alte scripturi de pe site, trimițând informații despre clicuri și coordonate.

API-ul JavaScript Google Maps oferă capabilități similare. Modulul este complet scriptat și funcționează din partea browserului, așa că nu avem nevoie de solicitări HTTP de la PHP și de formarea antetelor pe partea de server, așa cum a fost cazul în alte API-uri.

De exemplu, plasarea unui marcator pe o hartă va arăta astfel:

var mark = nou google.maps.Marker((
poziție: myPOS,
harta: harta,
titlu: "Bună ziua!"
});

Care este necesitatea și beneficiile utilizării API-ului?

Există destul de multe funcții utile.

Primul aspect

Puteți stabili interacțiunea interactivă a utilizatorului cu rețelele sociale și mesageria instantanee, puteți utiliza capacitățile sistemelor de calcul terțe pentru a afișa cursurile de schimb, vremea și alte informații importante.

Folosind API-ul, puteți conecta instantaneu alte resurse și soluții software la servere, ceea ce în mod normal ar dura săptămâni de dezvoltare. API-ul simplifică viața acolo unde nu este necesară o implementare unică, iar fiabilitatea și securitatea sunt o prioritate.

Al doilea aspect

Dacă sunteți proprietarul unei puteri de calcul complexe, a unui serviciu popular sau a stocării de date pentru acces public sau semi-privat, atunci o mișcare bună ar fi să vă creați propriul API. Ce va oferi:

  • Flux mare de clienți.
  • Acces simplificat la serviciile dvs. pentru parteneri.
  • Comoditatea analizei statistice a utilizării serviciilor.

Al treilea aspect

Aproape la fel ca al doilea. Dar fără a fi nevoie să implementați un API cu acces deschis. Dacă aveți un portal și doriți să creați o aplicație mobilă pentru acesta pe Android/IOS, atunci rescrierea sistemului sub un singur API este cea mai bună soluție. Întreaga structură a datelor este sistematizată. Site-ul și aplicația vor funcționa prin canale de date unice.

Windows API - un set de funcții ale sistemului de operare

Abrevierea API pare foarte misterioasă și chiar înfricoșătoare pentru mulți programatori începători. De fapt, o interfață de programare a aplicațiilor (API) este doar un set gata făcut de funcții pe care dezvoltatorii de aplicații le pot folosi. În general, acest concept este echivalent cu ceea ce anterior se numea mai des o bibliotecă de subrutine. Cu toate acestea, API se referă de obicei la o categorie specială de astfel de biblioteci.

În timpul dezvoltării aproape oricărei aplicații destul de complexe (MyApplication) pentru utilizatorul final, se formează un set de funcții interne specifice care sunt utilizate pentru implementarea acestui program special, care se numește API-ul MyApplication. Cu toate acestea, adesea se dovedește că aceste funcții pot fi utilizate eficient pentru a crea alte aplicații, inclusiv de către alți programatori. În acest caz, autorii, pe baza strategiei de promovare a produsului lor, trebuie să decidă întrebarea: deschid sau nu accesul la acest set pentru utilizatorii externi? Dacă răspunsul este da, expresia „Pachetul include un set deschis de funcții API” apare în descrierea pachetului software ca o caracteristică pozitivă (dar uneori pentru bani suplimentari).

Astfel, cel mai adesea un API se referă la un set de funcții care fac parte dintr-o aplicație, dar sunt disponibile și pentru utilizare în alte programe. De exemplu, Excel, pe lângă interfața cu utilizatorul final, are un set de funcții Excel API care pot fi utilizate, în special, atunci când se creează aplicații folosind VB.

În consecință, API-ul Windows este un set de funcții care face parte din sistemul de operare în sine și, în același timp, accesibil oricărei alte aplicații, inclusiv celor scrise folosind VB. În acest sens, analogia cu setul de întreruperi ale sistemului BIOS/DOS, care este de fapt un API DOS, este destul de justificată.

Diferența constă în faptul că gama de funcții API Windows, pe de o parte, este mult mai largă în comparație cu DOS și, pe de altă parte, nu include multe dintre instrumentele de gestionare directă a resurselor informatice care erau disponibile programatorilor în perioada precedentă. OS. În plus, apelurile către API-ul Windows sunt efectuate folosind apeluri procedurale obișnuite, iar apelurile către funcțiile DOS sunt efectuate printr-o instrucțiune specială de procesor numită Interrupt.

De ce avem nevoie de Win API pentru programatorii VB?

În ciuda faptului că VB are o mare varietate de funcții, în procesul de dezvoltare mai mult sau mai puțin serios se descoperă că capacitățile lor nu sunt adesea suficiente pentru a rezolva problemele necesare. În același timp, programatorii începători încep adesea să se plângă de deficiențele VB și să se gândească la schimbarea instrumentelor, fără a bănui că computerul lor are un set imens de instrumente și trebuie doar să știe cum să le folosească.

Când vă familiarizați cu API-ul Win, se descoperă că multe funcții VB încorporate nu sunt altceva decât apeluri la procedurile de sistem corespunzătoare, dar sunt implementate doar sub forma sintaxei unui anumit limbaj. Luând în considerare acest lucru, necesitatea utilizării API-ului este determinată de următoarele opțiuni:

  1. Funcții API care sunt complet implementate ca funcții VB încorporate. Cu toate acestea, uneori, în acest caz, este util să treceți la utilizarea API, deoarece aceasta poate uneori îmbunătăți semnificativ performanța (în special, datorită absenței transformărilor inutile ale parametrilor trecuți).
  2. Funcțiile VB încorporate implementează doar un caz special al funcției API corespunzătoare. Aceasta este o opțiune destul de comună. De exemplu, funcția API CreateDirectory are mai multe capacități decât operatorul VB MkDir încorporat.
  3. Un număr mare de funcții API nu au deloc analogi în versiunea actuală a limbajului VB. De exemplu, nu puteți șterge un director folosind VB - pentru a face acest lucru trebuie să utilizați funcția DeleteDirectory.

De asemenea, trebuie subliniat faptul că unele funcții API (ponderea lor în API-ul Win este foarte mică) nu pot fi apelate din programele VB din cauza unui număr de limitări ale limbajului, de exemplu, din cauza incapacității de a lucra cu adrese de memorie. Dar în unele cazuri, tehnicile de programare non-triviale pot ajuta (în special, în cazul acelorași adrese).

Punctul de vedere personal al autorului este acesta - în loc să extindă funcțiile încorporate ale VB de la versiune la versiune, ar trebui să i se ofere o descriere bună a celor mai populare funcții API. În același timp, aș dori să sfătuiesc dezvoltatorii să nu aștepte să apară o nouă versiune a instrumentului cu funcții extinse, ci să arunce o privire mai atentă asupra compoziției API-ului Win existent - este probabil ca capabilitățile de care aveți nevoie ar fi putut fi implementat deja în versiunea VB 1.0, lansată în 1991.

Cum să înveți Win API

Aceasta nu este o întrebare atât de simplă, având în vedere că numărul de funcții API Win32 este estimat la aproximativ 10 mii (nimeni nu știe cifra exactă, nici măcar Microsoft).

VB (versiunile 4-6) include un fișier care descrie declarațiile Win API - WIN32API.TXT (vă vom spune mai multe despre utilizarea acestuia mai târziu). Dar, în primul rând, cu ajutorul său, puteți obține informații despre scopul unei anumite funcții și parametrii acesteia numai prin numele mnemonice utilizate, iar în al doilea rând, lista de funcții din acest fișier este departe de a fi completă. La un moment dat (acum șapte ani), VB 3.0 avea fișiere de ajutor speciale care descriu funcțiile API-ului Win16. Cu toate acestea, deja în v.4.0 aceste informații utile cu o interfață convenabilă au dispărut.

Informații cuprinzătoare despre API-ul Win32 pot fi găsite în ajutorul Platform Software Development Kit, care este inclus în CD-urile MSDN Library incluse cu VB 5.0 și 6.0 Enterprise Edition și Office 2000 Developer Edition. Totuși, găsirea informațiilor necesare acolo și înțelegerea lor nu este deloc ușoară. Ca să nu mai vorbim că toate descrierile de acolo sunt date în raport cu limbajul C.

Cărțile celebrului expert american Daniel Appleman sunt în general recunoscute în lume pentru învățarea programării API în mediul VB. Ghidul lui Dan Appleman pentru programator Visual Basic pentru seria Windows API (pentru Win16, Win32 și diferite versiuni de VB) a fost una dintre cele mai bine vândute cărți pentru programatorii VB din 1993. Cartea Dan Appleman’s VB 5.0 Programmer’s Guide to the Win32 API, lansată în 1997, a fost adusă autorului din SUA de un prieten care a găsit-o în prima librărie a unui mic oraș de provincie.

Această carte are peste 1.500 de pagini, acoperind tehnici generale de programare API în VB, precum și peste 900 de funcții. CD-ul inclus conține textul integral al cărții și toate exemplele de programe, precum și câteva capitole suplimentare care nu sunt incluse în versiunea tipărită. În 1999, Dan Appleman a lansat o nouă carte, Win32 API Puzzle Book and Tutorial for Visual Basic Programers, care include informații despre alte 7.600 de funcții (deși nu la fel de extinse).

Win API și Dynamic Link Library (DLL)

Setul Win API este implementat sub formă de DLL-uri dinamice. În continuare, vom vorbi de fapt despre tehnologia de utilizare a DLL-urilor în mediul VB folosind exemplul de biblioteci incluse în API-ul Win. Cu toate acestea, atunci când vorbim despre DLL-uri, există câteva puncte importante de făcut.

În acest caz, prin DLL înțelegem versiunea tradițională a bibliotecilor binare dinamice, care oferă aplicațiilor acces direct la procedurile necesare - subrutine sau funcții (în același mod cu ceea ce se întâmplă la apelarea procedurilor în interiorul unui proiect VB). Astfel de biblioteci pot fi create folosind diferite instrumente: VC++, Delphi, Fortran, cu excepția VB (să vedem ce apare în versiunea 7.0) - acesta din urmă poate crea doar DLL-uri ActiveX, accesate prin interfața OLE Automation.

De obicei, fișierele de bibliotecă dinamice au extensia .DLL, dar aceasta nu este deloc necesară (pentru Win16 a fost folosită adesea extensia .EXE); driverele de dispozitive externe sunt desemnate folosind .DRV.

După cum am observat deja, este destul de dificil să determinați numărul exact de funcții API Windows și fișierele care le conțin, dar toate sunt situate în directorul de sistem. În acest sens, este mai bine să evidențiem compoziția bibliotecilor incluse în nucleul sistemului de operare și principalele biblioteci cu funcții suplimentare cheie.

Și acum câteva sfaturi.

Sfat 1. Asigurați-vă că anunțul dvs. DL este formatat corect L-proceduri

Însuși apelul la procedurile DLL dintr-un program arată exact la fel ca la procedurile Visual Basic „obișnuite”, de exemplu:

Apelați DllName([lista de argumente])

Cu toate acestea, pentru a utiliza funcții DLL externe (inclusiv Win API), acestea trebuie să fie declarate în program folosind declarația Declare, care arată astfel:

Declarați Sub ProcedureName Lib _ „LibraryName” _ [[([ArgumentList])]

Declarare Function FunctionName _ Lib „LibraryName” _ [[([ArgumentList])]

Aici, elementele opționale ale operatorului sunt afișate între paranteze drepte, expresiile variabile sunt în cursive, iar cuvintele rămase sunt cuvinte cheie. Sistemul de ajutor oferă o descriere destul de bună a sintaxei operatorului, așa că deocamdată vom nota doar câteva puncte.

Declarațiile de funcții externe ar trebui plasate în secțiunea Declarații generale a modulului. Dacă îl plasați într-un modul de formular, atunci trebuie să specificați cuvântul cheie Privat (această declarație va fi disponibilă numai în cadrul acestui modul) - aceasta este o limitare pentru toate procedurile modulului de formular.

Setul de API Win32 este implementat doar sub formă de funcții (API-ul Win16 avea multe rutine Sub). În cea mai mare parte, acestea sunt funcții de tip Long, care returnează cel mai adesea codul de finalizare al operației.

Operatorul Declare a apărut în MS Basic pe vremea DOS și era folosit și pentru declararea procedurilor interne ale proiectului. În Visual Basic acest lucru nu este necesar, deoarece declararea procedurilor interne este automat declarația lor Sub sau Funcție. În comparație cu Basic/DOS, noua descriere trebuie să indice numele fișierului bibliotecă în care se află procedura necesară. Bibliotecile Wip API sunt situate în directorul de sistem Windows, așa că este suficient să furnizați doar numele fișierului. Dacă accesați un DLL care se află într-o locație aleatorie, trebuie să notați calea completă către acest fișier.

Descrierea instrucțiunii Declare ocupă de obicei destul de mult spațiu și nu se încadrează pe o singură linie din fereastra de cod. Prin urmare, vă recomandăm să respectați o schemă specifică de întrerupere a liniilor atunci când scrieți aplicații, de exemplu:

Declarați funcția GetTempPath _ Lib „kernel32” Alias ​​„GetTempPathA” _ (ByVal nBufferLength As Long, _ ByVal lpBuffer As String) As Long

În acest caz, toate elementele principale ale descrierii sunt plasate pe linii diferite și, prin urmare, sunt ușor de citit.

Sfat 2: Fiți deosebit de atenți când lucrați cu funcții DLL

Utilizarea Win API și a diferitelor funcții DLL extinde semnificativ funcționalitatea VB și îmbunătățește adesea performanța programului. Cu toate acestea, prețul de plătit pentru aceasta este riscul de a reduce fiabilitatea aplicației, mai ales în timpul depanării acesteia.

Unul dintre cele mai importante avantaje ale mediului VB este fiabilitatea procesului de dezvoltare a programului: funcționând sub controlul unui interpret, codul programului teoretic nu poate perturba funcționarea Windows și VB în sine. Este posibil ca programatorul să nu fie foarte atent la corectitudinea transmiterii parametrilor către funcțiile apelate - astfel de erori vor fi detectate cu ușurință de către interpret însuși fie în timpul procesului de traducere a codului, fie în timpul executării acestuia. În cel mai neplăcut caz, modul de procesare va fi pur și simplu întrerupt, cu indicarea unde și de ce a apărut eroarea.

Utilizarea funcțiilor Windows API sau a altor DLL-uri înlătură direct un astfel de control asupra transferului de date și asupra procesului de execuție a codului în afara mediului VB. Prin urmare, o eroare în accesarea funcțiilor externe poate duce la inoperabilitatea atât a VB, cât și a sistemului de operare. Acest lucru este valabil mai ales în stadiul dezvoltării programului, când prezența erorilor este destul de naturală. Astfel, prin utilizarea capacităților mai largi ale funcțiilor stratului de bază al sistemului, programatorul își asumă responsabilitatea pentru utilizarea corectă a acestora.

Problema este agravată și mai mult de faptul că diferitele limbaje de programare folosesc moduri diferite de transmitere a parametrilor între proceduri. (Mai precis, diferite metode de trecere sunt utilizate în mod implicit, deoarece multe limbi pot suporta mai multe metode.) API-urile Win sunt implementate în C/C++ și folosesc convenții de transmitere a parametrilor C/C++ care diferă de versiunea obișnuită VB.

În acest sens, trebuie menționat că apariția analogilor funcțiilor API încorporate în VB este justificată tocmai de adaptarea acestora din urmă la sintaxa VB și implementarea unui mecanism adecvat de control al schimbului de date. Să remarcăm, de asemenea, că în etapa de depanare experimentală a aplicației la crearea unui modul executabil, este mai bine să folosiți opțiunea de compilare P-code în loc de Native Code (codul mașină). În primul caz, programul va rula sub controlul unui interpret - mai lent în comparație cu codul mașină, dar mai fiabil din punct de vedere al posibilului impact eronat asupra sistemului de operare și oferind un mod mai convenabil pentru identificarea eventualelor erori.

Sfatul 3: Cele zece sfaturi ale lui Dan Appleman pentru o programare robustă API în VB

Utilizarea funcției API necesită o programare mai atentă, folosind unele tehnici de apel de procedură mai puțin familiare (comparativ cu VB). Vom continua să abordăm aceste probleme în cele ce urmează. Și acum vă prezentăm un rezumat al sfaturilor formulate de Dan Appleman pe această temă (prima lor versiune a apărut încă în 1993) cu câteva dintre completările și comentariile noastre.

1. Amintiți-vă de ByVal. Cea mai frecventă greșeală făcută la accesarea funcțiilor API și DLL este utilizarea incorectă a cuvântului cheie ByVal: fie uită să-l includă, fie, dimpotrivă, îl introduc atunci când nu este necesar.

Aceste exemple arată impactul operatorului ByVal asupra trecerii parametrilor

Tipul de parametru Cu ByVal Fără ByVal
Întreg Un număr întreg de 16 biți este împins în stivă Adresa de 32 de biți a unui număr întreg de 16 biți este împinsă în stivă
Lung Un număr întreg de 32 de biți este împins în stivă Adresa de 32 de biți a unui număr întreg de 32 de biți este împinsă în stivă
Şir Șirul este convertit în formatul folosit în C (date și un octet nul final). Adresa de 32 de biți a liniei noi este împinsă în stivă Mânerul VB al șirului este împins pe stivă. (Asemenea mânere nu sunt niciodată folosite de API-ul Windows în sine și sunt recunoscute doar în DLL-urile implementate special pentru VB.)

Trebuie amintit aici că trecerea parametrilor în orice sistem de programare, inclusiv VB, se realizează în două moduri principale: prin referință (ByRef) sau prin valoare (ByVal). În primul caz, adresa variabilei este transmisă (această opțiune este utilizată implicit în VB), în al doilea - valoarea acesteia. Diferența fundamentală este că, folosind o referință, valoarea modificată a parametrului transmis este returnată programului apelant.

Pentru a înțelege acest lucru, efectuați un experiment folosind următoarele programe:

Dim v As Integer v = 2 Apelați MyProc(v) MsgBox „v = “ & v Sub MyProc (v As Integer) v = v + 1 End Sub

Când rulați acest exemplu, veți primi un mesaj cu valoarea variabilei egală cu 3. Faptul este că în acest caz adresa variabilei v, creată fizic în programul apelant, este transmisă subrutinei MyProc. Acum schimbați descrierea procedurii în

Sub MyProc (ByVal v Ca întreg)

Ca urmare, la executarea testului, veți obține v = 2, deoarece numai valoarea inițială a variabilei este transmisă procedurii - rezultatul operațiilor efectuate cu aceasta nu este returnat programului apelant. Modul de transfer după valoare poate fi modificat și folosind operatorul de apel, după cum urmează:

Sub MyProc (v As Integer) ... Apelați MyProc((v)) ‘ (v) - parantezele indică modul de transfer după valoare.

Cu toate acestea, la accesarea procedurilor interne VB, utilizarea cuvântului cheie ByVal în instrucțiunea Call este interzisă - se folosesc în schimb paranteze. Există o explicație pentru asta.

În cazul clasic (C, Fortran, Pascal), diferența dintre modurile ByRef și ByVal depinde de ceea ce exact este plasat pe stiva de schimb de date - adresa variabilei sau valoarea acesteia. Basic folosește din punct de vedere istoric o variantă a emulării software ByVal - există întotdeauna o adresă pe stivă, dar numai atunci când se trece prin valoare este creată o variabilă temporară pentru aceasta. Pentru a distinge între aceste două opțiuni (Classic și Basic), sunt utilizate moduri diferite de a descrie modul ByVal. Rețineți că emularea modului ByVal în VB oferă o fiabilitate mai mare a programului: prin amestecarea formei de referință, programatorul riscă doar ca valoarea corectată a variabilei să fie returnată (sau să nu fie returnată) programului apelant. În versiunea „clasică”, o astfel de confuzie poate duce la o eroare fatală la executarea unei proceduri (de exemplu, atunci când în locul unei adrese de memorie este utilizată o valoare variabilă egală cu, de exemplu, zero).

Funcțiile DLL sunt implementate conform principiilor „clasice” și, prin urmare, necesită o descriere obligatorie a modului în care datele sunt schimbate cu fiecare dintre argumente. Declarațiile de funcție prin descrierea Declare (mai precis, lista de argumente transmise) servesc acestui scop. Cea mai obișnuită modalitate de a transmite parametri unei funcții API Windows sau DLL este utilizarea cuvântului cheie ByVal. Mai mult, poate fi specificat atât în ​​operatorul Declare cât și direct la apelarea funcției.

Consecințele trecerii incorecte ale parametrilor sunt ușor de prezis. Dacă primiți o adresă evident invalidă, veți primi un mesaj GPF (General Protection Fault). Dacă funcția primește o valoare care se potrivește cu o adresă validă, atunci funcția API va intra într-o zonă străină (de exemplu, kernelul Windows) cu toate consecințele dezastruoase care decurg.

2. Verificați tipul de parametri care sunt transmisi. Numărul și tipul corect de parametri trecuți sunt la fel de importanți. Este necesar ca argumentele declarate în Declare să se potrivească cu parametrii așteptați în funcția API. Cel mai frecvent caz de eroare în transmiterea parametrilor implică diferența dintre NULL și un șir de lungime zero - rețineți că acestea nu sunt același lucru.

3. Verificați tipul de returnare.

VB este destul de tolerant cu nepotrivirile tipului de returnare a funcției, deoarece valorile numerice sunt de obicei returnate prin registre, mai degrabă decât prin stivă. Următoarele reguli vor ajuta la determinarea valorii corecte returnate de o funcție API:

  • O funcție DLL care nu returnează o valoare (analog cu void în „C”) trebuie să fie declarată ca sub VB.
  • O funcție API care returnează o valoare întreagă (Integer sau Long) poate fi definită fie ca Sub, fie ca Funcție care returnează o valoare de tipul adecvat.
  • Niciuna dintre funcțiile API nu returnează numere în virgulă mobilă, dar unele DLL-uri pot returna acest tip de date.

4. Utilizați construcția „As Any” cu mare grijă. Multe funcții API Windows au capacitatea de a accepta parametri de diferite tipuri și de a utiliza construcția As Any pentru a face acest lucru (interpretarea tipului este efectuată în funcție de valoarea altor parametri trecuți).

O soluție bună în acest caz poate fi utilizarea mai multor alias-uri (Alias) ale unei funcții prin crearea a două sau mai multe declarații pentru aceeași funcție, fiecare declarație specificând parametri de un anumit tip.

5. Nu uitați să inițializați șirurile. Există multe funcții în API-ul Win care returnează informații prin încărcarea datelor în buffer-uri de șir transmise ca parametru. În programul dvs., se pare că puteți face totul corect: nu uitați de ByVal, transmiteți corect parametrii funcției. Dar Windows nu poate verifica cât de mare este dimensiunea memoriei alocate pentru un rând. Dimensiunea rândului trebuie să fie suficient de mare pentru a găzdui toate datele care pot fi plasate în el. Responsabilitatea pentru rezervarea unui buffer de dimensiunea necesară revine programatorului VB.

Trebuie remarcat faptul că în Windows pe 32 de biți, atunci când se utilizează șiruri de caractere, conversia se realizează din Unicode (codare dublu octet) în ANSI (codare pe un singur octet) și înapoi, ținând cont de setările sistemului național. Prin urmare, pentru rezervarea bufferelor, uneori este mai convenabil să folosiți matrice de octeți în loc de variabile șir. (Mai multe despre asta mai jos.)

Cel mai adesea, funcțiile Win API vă permit să definiți singur dimensiunea maximă a blocului. În special, uneori, acest lucru necesită apelarea unei alte funcții API care „va spune” dimensiunea blocului. De exemplu, GetWindowTextLength vă permite să determinați lungimea șirului necesară pentru a păstra titlul ferestrei returnat de funcția GetWindowText. În acest caz, Windows vă asigură că nu treceți peste bord.

6. Asigurați-vă că utilizați Opțiunea explicită.

7. Verificați cu atenție valorile parametrilor și valorile returnate. VB are capacități bune de verificare a tipului. Aceasta înseamnă că atunci când încercați să transmiteți un parametru nevalid unei funcții VB, cel mai rău lucru care se poate întâmpla este că primiți un mesaj de eroare de la VB. Dar acest mecanism, din păcate, nu funcționează la accesarea funcțiilor Windows API.

Windows 9x a îmbunătățit verificarea parametrilor pentru majoritatea funcțiilor API. Prin urmare, prezența unei erori în date nu provoacă, de obicei, o eroare fatală, dar determinarea a ceea ce a cauzat nu este atât de ușoară.

Aici vă recomandăm să folosiți mai multe moduri de a depana acest tip de eroare:

  • Utilizați modul de depanare pas cu pas sau comanda Debug.Print pentru a verifica fiecare apel de funcție API suspect. Verificați rezultatele acestor apeluri pentru a vă asigura că totul este normal și că funcția este finalizată corect;
  • utilizați un depanator Windows precum CodeView și o versiune de depanare a Windows (disponibilă în Windows SDK). Aceste instrumente pot detecta o eroare de parametru și cel puțin pot determina ce funcție API cauzează eroarea;
  • Utilizați instrumente suplimentare de la terți pentru a verifica tipurile de parametri și validitatea valorilor acestora. Astfel de instrumente nu numai că pot găsi erori de parametri, ci chiar pot indica linia de cod VB unde a apărut eroarea.

În plus, este necesar să verificați rezultatul executării funcției API.

8. Amintiți-vă că numerele întregi în VB și în Windows nu sunt același lucru.În primul rând, trebuie să rețineți că termenul „Integer” în VB înseamnă un număr de 16 biți, în timp ce în documentația Win 32 înseamnă un număr de 32 de biți. În al doilea rând, numerele întregi (Integer și Long) în VB sunt cantități semnate (adică o cifră este folosită ca semn, restul ca mantisă a numărului), în Windows sunt folosite doar numere nenegative. Această circumstanță trebuie reținută atunci când formați un parametru transmis utilizând operații aritmetice (de exemplu, calcularea unei adrese prin însumarea unei baze și a unui offset). Funcțiile aritmetice standard VB nu sunt potrivite pentru aceasta. Vom discuta separat ce să facem în acest caz.

9. Acordați o atenție deosebită numelor de funcții. Spre deosebire de Win16, numele tuturor funcțiilor API Win32 sunt sensibile la utilizarea exactă a literelor mici și mari (nu a fost cazul în Win16). Dacă utilizați undeva o literă mică în loc de una mare sau invers, atunci funcția dorită nu va fi găsită. De asemenea, aveți grijă să utilizați corect sufixul A sau W în funcțiile care utilizează parametri șir. (Pentru mai multe despre aceasta, vezi mai jos.)

10. Salvează-ți munca des. Erorile asociate cu utilizarea incorectă a DLL-urilor și a API-urilor Win pot duce la o întrerupere de urgență a mediului VB și, eventual, a întregului sistem de operare. Ar trebui să vă asigurați că codul pe care îl scrieți este salvat înainte de rularea testului. Cel mai simplu lucru este să setați modul de înregistrare automată a modulelor de proiect înainte de a începe proiectul în mediul VB.

După ce ați citit sfaturile anterioare, puteți crede că folosirea funcțiilor Win API este riscantă. Într-o oarecare măsură, acest lucru este adevărat, dar numai în comparație cu programarea sigură oferită de VB însuși. Dar, cu o utilizare pricepută și cunoașterea posibilelor capcane, acest risc este minim. În plus, este adesea pur și simplu imposibil să renunți complet la utilizarea Win API - acestea vor fi în continuare necesare pentru orice dezvoltare serioasă.

În plus, am menționat anterior capcanele pentru o clasă largă de DLL-uri. În cazul API-ului Win, totul este mult mai simplu, deoarece formularul de accesare a acestor funcții este clar unificat. Trebuie avute în vedere următoarele puncte principale:

  1. Funcțiile Win32 API sunt doar atât: funcții, adică proceduri de tip Function (au fost multe sub rutine în Win16 API). Toate acestea sunt funcții de tip Long, deci descrierile lor sunt scrise în următoarea formă: Declarare Function name ... As Long „funcție tip _ este definit explicit

    Declarați numele funcției& ‘ tipul funcției _ este determinat folosind sufixul

    Apelul la funcția API arată astfel:

Rezultat& = ApiName& ([ ArgumentList]
  1. Cel mai adesea, valoarea returnată a unei funcții este codul de finalizare al operației. Mai mult, o valoare diferită de zero în acest caz înseamnă finalizare normală, zero înseamnă o eroare. De obicei (dar nu întotdeauna) puteți clarifica natura erorii apelând funcția GetLastError. Descrierea acestei funcții arată astfel: Funcția Declarare GetLastError& Lib „kernel32” ()

    ATENŢIE! Când lucrați în VB, este mai bine să utilizați proprietatea LastDLLError a obiectului Err pentru a obține valoarea codului de eroare calificat, deoarece VB uneori resetează funcția GetLastError între apelarea API-ului și continuarea executării programului.

    Puteți interpreta codul returnat de GelLastError folosind constante scrise în fișierul API32.TXT, cu nume care încep cu sufixul ERROR_.

    Cele mai tipice erori au următoarele coduri:

    • ERROR_INVALID_HANDLE = 6& - indicator nevalid
    • ERROR_CALL_NOT_IMPLEMENTED = 120& - apelarea unei funcții în Windows 9x care este disponibilă numai pentru Windows NT
    • ERROR_INVALID_PARAMETER = 87& - valoare incorectă a parametrului

    Cu toate acestea, multe funcții returnează valoarea unui parametru solicitat (de exemplu, OpenFile returnează valoarea mânerului fișierului). În astfel de cazuri, eroarea este determinată de o altă valoare specială Return&, cel mai adesea 0 sau –1.

  2. API-urile Win32 folosesc modalități strict fixe de a transfera cele mai simple tipuri de date. a) ByVal...As Long

    Cel puțin 80% din trecerea argumentelor se face folosind variabile Long. Rețineți că argumentul Mereu este însoțit de cuvântul cheie ByVal, iar acest lucru, printre altele, înseamnă că se efectuează un transfer de date unidirecțional - de la programul VB la funcția API.

    B) ByVal...As String

    Acest tip de transfer de date apare destul de des și cu argumentul Mereu ByVal se aplică. Când este apelată o funcție API, adresa șirului este scrisă în stivă, deci în acest caz este posibil schimbul de date în două sensuri. Există mai multe pericole de care trebuie să fii conștient atunci când lucrezi cu șiruri.

    Prima este că rezervarea memoriei pentru un șir se face în programul de apelare, deci dacă funcția API va umple șiruri, atunci trebuie să creați un șir de dimensiunea necesară înainte de a-l apela. De exemplu, funcția GetWindowsDirectory returnează calea către directorul Windows, care, prin definiție, nu trebuie să aibă mai mult de 144 de caractere. În consecință, apelarea acestei funcții ar trebui să arate cam așa:

    WinPath$ = Space$(144) ' rezervă un șir de _ 144 caractere Rezultat& = GetWindowsDirectory& (WinTath$, 144) _ ' umple bufferul ' Result& - numărul real de caractere din _ numele directorului WinPath$ = Left$(WinPath , Rezultat&)

    A doua problemă este că la apelarea unei funcții API, șirul sursă este convertit într-o reprezentare internă, iar la ieșirea din funcție, invers. Dacă în zilele Win16 această operațiune consta doar în adăugarea unui octet zero la sfârșitul liniei, atunci odată cu apariția Win32 acest lucru s-a adăugat la transformarea codificării Unicode pe dublu octet în ANSI și invers. (Acest lucru a fost discutat în detaliu în articolul „Features of work with string variables in VB”, ComputerPress 10’99 și 01’2000). Deocamdată, să reținem că folosind construcția ByVal ... As String, puteți schimba șiruri de caractere doar cu date de caractere.

    B) ...Ca oricare

    Aceasta înseamnă că o anumită adresă de memorie tampon va fi împinsă în stivă, al cărei conținut va fi interpretat de funcția API, de exemplu, în funcție de valoarea altor argumente. Cu toate acestea, As Any poate fi folosit doar în declarația Declare - atunci când o anumită funcție este apelată, o anumită variabilă trebuie definită ca argument.

    D) ... Ca UserDefinedType

    Acest design este adesea folosit și atunci când este necesar să se facă schimb de date (în general în ambele direcții) folosind o anumită structură. De fapt, această construcție este un fel de implementare concretă a formei de transmisie As Any, doar că în acest caz funcția este configurată la o structură fixă.

    Forma structurii de date este determinată de funcția API specifică și este responsabilitatea programatorului să o descrie și să o rezerve în mod corespunzător în programul apelant. Acest design Mereu folosit fără cuvintele ByVal, adică în acest caz, se efectuează transferul prin referință - adresa variabilei este scrisă în stivă.

Exemplu de apelare a unei funcții API

Să ilustrăm cele de mai sus folosind exemplul de utilizare a două funcții utile pentru lucrul cu fișiere - lopen și lread, care sunt descrise după cum urmează:

Declarare Funcție lopen Lib „kernel32” _ Alias ​​​​“_lopen” (_ ByVal lpFileName As String, _ ByVal wReadWrite As Long) As Long Declarare Funcție lread Lib „kernel32” _ Alias ​​​​“_lread” (_ ByVal hFile As Long, lpBuffer As Any, _ ByVal wBytes As Long) Cât timp

În VB, analogii lor - în acest caz exact - sunt operatorii Open și Get (pentru modul Binary). Permiteți-ne să acordăm imediat atenție utilizării cuvântului cheie Alias ​​într-o declarație de funcție - acesta este exact cazul când nu puteți face fără el. Numele actuale ale funcțiilor din bibliotecă încep cu un caracter de subliniere (stil tipic de limbaj C), care nu este permis în VB.

Operația de deschidere a fișierului ar putea arăta astfel:

Const INVALID_HANDLE_VALUE = -1 ' incorectă _ valoarea descriptorului lpFileName$ = „D:\calc.bas” ' numele fișierului wReadWrite& = 2 ' modul citire-scriere hFile& = lopen(lpFileName$, wReadWrite&) _ ' definiți descriptorul fișierului Dacă hFile& = INVALID_HANDLE_VALUE Apoi _ ' eroare la deschiderea fișierului ' specificați codul de eroare CodeError& = Err.LastDllError 'CodeError& = GetLastError _ ' această construcție nu funcționează End If

Aici trebuie să fiți atenți la două puncte:

  • ca valoare a funcției obținem valoarea descriptorului de fișier. Eroarea corespunde unei valori de –1;
  • Tocmai în acest caz nu funcționează apelarea funcției GetLastError - pentru a obține o valoare de eroare rafinată, am apelat la obiectul Err (am vorbit despre posibilitatea unei astfel de situații mai sus).

Conținutul fișierului poate fi apoi citit, dar acest lucru presupune că programatorul trebuie să înțeleagă structura acestuia (la fel cum este cazul când lucrează cu fișiere binare arbitrare). În acest caz, apelarea funcției lread ar putea arăta astfel:

Dim MyVar As Single wBytes = lread (hFile&, MyVar, Len(MyVar) ' citind un număr real, 4 octeți ' wBytes este numărul de date citite efectiv, ' -1 este o eroare... Tastați MyStruct x As Single i As Integer End Type Dim MyVar As MyStruct wBytes = lread (hFile&, MyVar, Len(MyVar)) Structura de date citită, 6 octeți

Vă rugăm să rețineți din nou: al doilea argument al funcției este transmis prin referință, restul sunt transmise prin valoare.

Dim MyVar As String MyVar = Space$(10) ‘rezervă o variabilă pentru 10 caractere wBytes = lread (hFile&, ByVal MyVar, Len(MyVar)) ‘ citește un șir de caractere, 10 caractere

Aici puteți vedea o diferență importantă față de exemplul anterior - variabila șir este însoțită în mod necesar de cuvântul cheie ByVal.

Citirea conținutului unui fișier într-o matrice (pentru simplitate, vom folosi o matrice de octeți unidimensională) se face după cum urmează:

Dim MyArray(1 To 10) As Byte wBytes = lread (hFile&, MyArray(1), _ Len(MyArray(1))* 10) ‘ citește 10 elemente de matrice

Specificând primul element al matricei ca argument, transmitem adresa de la începutul zonei de memorie rezervată matricei. Evident, puteți umple orice fragment dintr-o matrice în acest fel:

WBytes = lread (hFile&, MyArray(4), _ Len(MyArray(1))* 5) ‘ citește elementele matricei de la 4 la 8

Sfat 5: Folosiți Alias ​​pentru Gearsși parametrii ca oricare

Aici, pe baza exemplului anterior, vom dezvălui esența celui de-al patrulea sfat al lui Dan Appleman.

Când lucrați cu funcția lread, trebuie să vă amintiți că atunci când o accesați folosind o variabilă șir, trebuie să utilizați cuvântul cheie ByVal (altfel veți primi mesaje despre o operațiune ilegală). Pentru a vă proteja, puteți face o descriere specială suplimentară a aceleiași funcții care să funcționeze numai cu variabile șir:

Declarați funcția lreadString Lib „kernel32” _ Alias ​​​​“_lread” (_ ByVal hFile As Long, ByVal lpBuffer As String, _ ByVal wBytes As Long) As Long

Când lucrați cu această descriere, nu mai trebuie să specificați ByVal când contactați:

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

S-ar părea că sintaxa operatorului Declare vă permite să faceți o descriere specială similară pentru o matrice:

Declarați funcția lreadString Lib „kernel32” Alias ​​„_lread” (_ ByVal hFile As Long, lpBuffer() As Byte, _ ByVal wBytes As Long) As Long

Cu toate acestea, recursul

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

duce inevitabil la o eroare fatală a programului.

Aceasta este o continuare a conversației despre particularitățile procesării variabilelor șir în Visual Basic: VB utilizează codificare Unicode pe dublu octet, Win API folosește ANSI pe un singur octet (și cu formatul adoptat în C - cu un octet zero la sfârșit) . În consecință, atunci când se utilizează variabile șir ca argument, conversia din Unicode în ANSI este întotdeauna efectuată automat la apelarea unei funcții API (mai precis, o funcție DLL) și conversia inversă la întoarcere.

Dezbaterea de aici este simplă: variabilele șir pot fi folosite pentru a face schimb de date de caractere, dar nu pot fi folosite pentru a schimba informații binare arbitrare (cum a fost cazul versiunilor VB pe 16 biți). În acest din urmă caz, este mai bine să utilizați o matrice de octeți unidimensională.

După cum știți, tipul String poate fi folosit pentru a descrie o structură personalizată. În acest sens, trebuie să rețineți următoarele:

  • Este strict interzisă utilizarea următoarei construcții pentru a accesa API-ul Win: Type MyStruct x As Single s As String ‘variable-length string End Type

    În cazul unui șir de lungime variabilă, un descriptor de șir este transmis ca parte a structurii cu toate consecințele care decurg sub forma unei erori de execuție a programului.

  • Puteți utiliza un șir cu lungime fixă ​​ca element de structură: Type MyStruct x As Single s As String*8 ‘ fixed-length string End Type

În acest caz, se realizează conversia de codificare corespunzătoare.

Și o ultimă notă: în niciun caz nu trebuie să utilizați o serie de variabile șir (atât cu lungime fixă, cât și cu lungime variabilă) atunci când accesați o funcție API. În caz contrar, apariția unei „operațiuni ilegale” va fi garantată.

Este probabil să aveți o situație în care trebuie să vă scrieți propriile funcții DLL. Necesitatea acestui lucru va apărea inevitabil dacă utilizați tehnologie de programare mixtă - folosind două sau mai multe limbaje de programare pentru a implementa o aplicație.

În acest sens, observăm că programarea mixtă este destul de comună pentru implementarea unei aplicații destul de complexe. Într-adevăr, fiecare limbă (mai precis, un sistem de programare bazat pe un limbaj) are propriile sale puncte tari și puncte slabe, așa că este destul de logic să profităm de diferite instrumente pentru a rezolva diferite probleme. De exemplu, VB - pentru crearea unei interfețe cu utilizatorul, C - pentru acces eficient la resursele sistemului, Fortran - pentru implementarea algoritmilor numerici.

Opinia autorului este aceasta: orice programare serioasă necesită ca dezvoltatorul să fie competent în cel puțin două instrumente. Desigur, în condițiile moderne de diviziune clară a muncii este foarte dificil să fii un expert excelent chiar și în două sisteme, așa că schema „limbi principale și auxiliare” este mai logică. Ideea aici este că chiar și o cunoaștere superficială a limbajului „auxiliar” (scrierea unor proceduri destul de simple) poate îmbunătăți foarte mult eficiența utilizării limbajului „principal”. Rețineți că cunoașterea VB, cel puțin ca auxiliară, este astăzi aproape o cerință obligatorie pentru un programator profesionist. Apropo, pe vremea DOS, cunoașterea elementelor de bază ale Assembler era extrem de dorită pentru orice programator, inclusiv Basic.

Într-un fel sau altul, chiar și în munca de grup, atunci când fiecare programator este angajat în propria sa sarcină specifică, toți participanții la proiect ar trebui să aibă o idee despre caracteristicile interfeței procedurale în diferite limbi. Și să știți că multe sisteme de programare (inclusiv VB), pe lângă interfața implicită, vă permit să utilizați alte metode avansate de accesare a procedurilor care fac posibilă adaptarea interfeței la o altă limbă.

Când studiați interfața interprocedurală, ar trebui să acordați atenție următoarelor posibile capcane:

  • Diferite limbi pot folosi convenții diferite pentru scrierea identificatorilor. De exemplu, este obișnuit să folosiți un caracter de subliniere la începutul unui nume de procedură, ceea ce nu este permis în VB. Această problemă este ușor de rezolvat prin utilizarea cuvântului cheie Alias ​​în declarația Declare (vezi exemplul sfatul 2.3).
  • Poate fi folosită o secvență diferită de scriere a argumentelor transmise pe stivă. De exemplu, pe vremea DOS (recunosc sincer, nu știu cum arată acum în mediul Windows), C a scris argumente de la sfârșitul listei, alte limbi (Fortran, Pascal, Basic) - de la inceput.
  • În mod implicit, sunt utilizate diferite principii de transmitere a parametrilor - prin referință sau după valoare.
  • Diverse principii pentru stocarea variabilelor șir. De exemplu, în C (precum și în Fortran și Pascal), lungimea unui șir este determinată de octetul nul de la sfârșitul acestuia, dar în Basic lungimea este scrisă explicit în descriptorul șirului. Desigur, trebuie să aveți în vedere posibilitatea de a utiliza diferite codificări de caractere.
  • Când transferați matrice multidimensionale, ar trebui să vă amintiți că sunt posibile diferite opțiuni pentru conversia structurilor multidimensionale în structuri unidimensionale (începând de la primul index sau de la ultimul, în raport cu matricele bidimensionale - „pe rânduri” sau „pe coloane” ).

Ținând cont de toate acestea, se pot formula următoarele recomandări:

  • Utilizați cele mai simple și dovedite metode pentru a transmite argumente funcțiilor DLL. Standardele adoptate pentru API-ul Win sunt destul de potrivite ca model.
  • Nu trece niciodată matrice de variabile șir.
  • Fiți foarte atenți când treceți variabile șir simple și matrice multidimensionale.
  • Asigurați-vă că verificați în mod special funcționalitatea mecanismului de transmitere a argumentelor către procedura apelată și înapoi. Scrieți un test special pentru a verifica transferul de date. Verificați separat dacă fiecare argument este transmis corect. De exemplu, dacă aveți o procedură cu mai multe argumente, verificați mai întâi dacă fiecare parametru este transmis corect pentru opțiunea cu un singur argument și abia apoi pentru întreaga listă.

Dar dacă funcția DLL este deja scrisă, de exemplu, în Fortran, dar interfața sa de intrare nu se potrivește foarte bine în standardele VB de mai sus? Există două sfaturi aici. Mai întâi: scrieți o funcție DLL de testare și utilizați-o pentru a încerca să găsiți apelul dorit din programul VB folosind încercare și eroare. În al doilea rând: scrieți o procedură de adaptor în același Fortran care ar oferi o interfață simplă între VB și o funcție DLL cu conversia structurilor de date simple în altele complexe (de exemplu, convertiți o matrice de octeți multidimensională într-o matrice de șiruri).

Deci: utilizați funcțiile DLL. Dar fii vigilent...

ComputerPress 9"2000

Acest termen scurt este binecunoscut tuturor celor care au cel puțin o oarecare experiență în dezvoltare. Dar nu toată lumea înțelege ce înseamnă exact și de ce este nevoie. Dezvoltator Petru Gazarov a vorbit despre API în cuvinte simple pe blogul său.

Abrevierea API înseamnă „Application Programming Interface” (interfață de programare a aplicației, interfață de programare a aplicației). Majoritatea companiilor mari la un moment dat dezvoltă API-uri pentru clienți sau pentru uz intern. Pentru a înțelege cum și cum sunt utilizate API-urile în dezvoltare și afaceri, mai întâi trebuie să înțelegeți cum funcționează World Wide Web.

World Wide Web și servere la distanță

WWW-ul poate fi gândit ca o rețea uriașă de servere interconectate pe care este stocată fiecare pagină. Un laptop obișnuit poate fi transformat într-un server capabil să deservească un întreg site web în rețea, iar dezvoltatorii folosesc servere locale pentru a crea site-uri web înainte de a le deschide pentru o gamă largă de utilizatori.

Când este introdus în bara de adrese a browserului www.facebook.com O solicitare corespunzătoare este trimisă la serverul Facebook de la distanță. Odată ce browserul primește răspunsul, interpretează codul și afișează pagina.

De fiecare dată când un utilizator vizitează o pagină de pe Internet, el interacționează cu API-ul serverului de la distanță. API-ul este partea componentă a serverului care primește cereri și trimite răspunsuri.

API ca o modalitate de a servi clienții

Multe companii oferă API-uri ca un produs gata făcut. De exemplu, Weather Underground vinde acces la API-ul de date meteo.

Scenariul de utilizare: Pe site-ul unei companii mici există un formular de programare pentru clienți. Compania dorește să integreze Google Calendar în acesta pentru a oferi clienților posibilitatea de a crea automat un eveniment și de a introduce detalii despre o întâlnire viitoare.

Aplicație API: Scopul este ca serverul site-ului să contacteze direct serverul Google cu o solicitare de a crea un eveniment cu detaliile specificate, de a primi răspunsul Google, de a-l procesa și de a trimite informațiile corespunzătoare către browser, de exemplu, un mesaj de confirmare către utilizator. .

Alternativ, browserul poate face o solicitare către API-ul serverului Google fără a trece prin serverul companiei.

Prin ce diferă API-ul Google Calendar de API-ul oricărui alt server la distanță din rețea?

Din punct de vedere tehnic, diferența este în formatul cererii și al răspunsului. Pentru a genera o pagină web completă, browserul așteaptă un răspuns în limbajul de marcare HTML, în timp ce API-ul Google Calendar va returna pur și simplu date într-un format precum JSON.

Dacă o solicitare către API este făcută de serverul site-ului unei companii, atunci acesta este clientul (la fel cum browserul este client atunci când utilizatorul deschide site-ul).

Datorită API-ului, utilizatorul are posibilitatea de a efectua o acțiune fără a părăsi site-ul web al companiei.

Cele mai multe site-uri web moderne folosesc cel puțin câteva API-uri terțe. Multe sarcini au deja soluții gata făcute oferite de dezvoltatori terți, fie că este vorba despre o bibliotecă sau un serviciu. Este adesea mai ușor și mai fiabil să recurgeți la o soluție gata făcută.

Mulți dezvoltatori distribuie aplicația pe mai multe servere, care interacționează între ele folosind API-ul. Serverele care îndeplinesc o funcție de suport pentru serverul principal de aplicații sunt numite microservicii.

Deci, atunci când o companie oferă un API utilizatorilor săi, înseamnă pur și simplu că a creat o serie de adrese URL speciale care returnează doar date ca răspuns.

Astfel de solicitări pot fi adesea trimise printr-un browser. Deoarece transferul de date HTTP are loc sub formă de text, browserul va putea întotdeauna să afișeze răspunsul. De exemplu, printr-un browser puteți accesa direct API-ul GitHub (https://api.github.com/users/petrgazarov), fără un token de acces și puteți primi acest răspuns în format JSON:

Browserul afișează perfect răspunsul JSON, care poate fi inserat în cod. Este suficient de ușor să extragi date dintr-un astfel de text pentru a-l folosi la discreția ta.

Mai multe exemple de API

Cuvântul „aplicare” poate avea semnificații diferite. În contextul API-ului, aceasta înseamnă:

  • o bucată de software cu o anumită funcție,
  • întregul server, întreaga aplicație sau doar o parte separată a aplicației.

Orice bucată de software care poate fi distinsă clar de mediu poate înlocui litera „A” într-o abreviere în engleză și poate avea, de asemenea, un fel de API. De exemplu, atunci când un dezvoltator implementează o bibliotecă terță parte în cod, aceasta devine parte a întregii aplicații. Ca o bucată de software autonomă, biblioteca va avea un fel de API care îi permite să interacționeze cu restul codului aplicației.

În proiectarea orientată pe obiecte, codul este reprezentat ca o colecție de obiecte. Într-o aplicație, pot exista sute de astfel de obiecte care interacționează între ele. Fiecare dintre ele are propriul set API public proprietăți și metode de interacțiune cu alte obiecte din aplicație. Obiectele pot avea, de asemenea privat, logică internă care este ascunsă de mediu și nu este un API.