Kako postaviti pametne telefone i računala. Informativni portal
  • Dom
  • TV (Smart TV)
  • API funkcije jezika Visual Basic. Aplikacijsko programsko sučelje API podataka što

API funkcije jezika Visual Basic. Aplikacijsko programsko sučelje API podataka što

Kako bi olakšali rad svojim kolegama i osigurali svim Windows programima univerzalno sučelje, Microsoftovi programeri stvorili su nešto poput API-ja - "Application Programming Interface".

Ovo je skup funkcija i postupaka koje programi najčešće koriste: prikaz stabla direktorija, traženje datoteka, prikaz standardnog prozora s gumbima za zatvaranje, minimiziranje i maksimiziranje i mnoge druge. Kao rezultat toga, programer koji stvara program za Windows ne mora razmišljati i razvijati posebne potprograme za prikaz prozora programa, prozora za odabir mape i druge slične elementarne operacije - on može jednostavno pozvati kernel32.dll ili user32.dll iz knjižnica koje sadrže funkcije i procedure API-ja, funkcija koja mu treba, a ona će sve učiniti za njega sama. Postoji mnogo takvih funkcija i postupaka - oko 600.

U operacijskom sustavu MS-DOS nije postojao API - onaj tko se obvezao napisati program za ovaj operativni sustav bio je dužan osmisliti i implementirati metode za prikaz slika na ekranu, primanje podataka od korisnika, od od početka do kraja.putovanje kroz datotečni sustav,crtanje grafika,ako je takva mogućnost bila potrebna 2. To je proces razvoja programa sa sučeljem prilagođenim korisniku učinilo vrlo napornim procesom; često su vrijeme i trud utrošeni na stvaranje prihvatljivog grafičkog sučelja za program premašivali troškove implementacije vlastitog algoritma programa, za koji je kreiran . Nisu uzalud bile vrlo česte takozvane "konzolne" aplikacije, odnosno programi koji su radili samo iz naredbenog retka, bez sučelja - podaci su se unosili na istom naredbenom retku ili se izrađivali iz datoteke navedene u njemu, a rezultati su ispisani u jednostavnom tekstualnom načinu.

S pojavom operacijskog sustava Windows, naporan rad programera na razvoju izgleda programa i praktičnih metoda za unos i izlaz informacija bio je uvelike olakšan - API funkcije već su korištene u sustavu Windows 3.0. Sada programer, ako je, na primjer, želio stvoriti prozor za unos teksta ili traku za pomicanje, trebao je samo napisati poziv funkciji za prikaz takvog prozora s parametrima koji su mu potrebni, kao i svaka druga funkcija jezik na kojem je napisao svoj program, a ne uvoditi ogromne količine koda za kreiranje programa koji ponovno iscrtava takav prozor ili traku (pri čemu je svjestan da će pri razvoju sljedećeg programa koji također koristi takve objekte morati razviti ponovno takav kod ili pokušajte djelomično koristiti stari, prilagođavajući ga potrebama ovog novog programa). Stoga je pojava API-ja napravila revolucionarni pomak u tehnologiji programiranja, omogućujući vam stvaranje potrebnih programa s poznatim, praktičnim sučeljem mnogo brže, bez brige o takvim rutinskim detaljima kao što je programiranje standardnih objekata sučelja za unos i izlaz informacija.

U jeziku Visual Basic for Applications (VBA) mnoge se funkcije i API procedure pozivaju same od sebe kada prevoditelj izvrši program, tako da nema apsolutno nikakve potrebe koristiti ih za prikaz prozora za unos i izlaz teksta, crtanje geometrijskih oblika na ekran i druge jednostavne radnje - VBA ih poziva prema potrebi, a program na njemu samo treba koristiti odgovarajuće funkcije ovog jezika. Međutim, ponekad postoji potreba za određenim radnjama za koje ili nema analoga u ugrađenim VBA funkcijama, ili rade neracionalno ili presporo. Na primjer, prozor za odabir mape sa slikom stabla direktorija (Sl. 5.1) ili program za pretraživanje datoteka (analog u funkcijama VBA - objekt "Application.FileSearch" - radi presporo s velikim brojem datoteka). Za takve slučajeve VBA pruža mogućnost pozivanja API funkcija.

Nažalost, korištenje API funkcija u VBA nije dokumentirano u pomoći, pa da biste naučili kako ih koristiti morate ili potražiti knjige ili online izvore o uredskom programiranju ili analizirati kod programa koji sadrže pozive API funkcijama.

U velikoj većini slučajeva, kada programirate za Office, možete bez upotrebe API-ja, ali ponekad se samo pozivanjem API funkcije može postići željeni rezultat. Recimo da trebate osigurati da se različite makronaredbe pozivaju kada jednostavno kliknete mišem na gumb na alatnoj traci programa Word i kada istovremeno pritisnete ovaj gumb i tipku Shift ili Control. Evo isječka koda koji to radi:

Deklarirajte funkciju GetAsyncKeyState Lib "user32.dll" (ByVal kState As Long) kao cijeli broj

GetAsyncKeyState(vbKeyShift ili vbKeyControl)

Ako GetAsyncKeyState(vbKeyShift) Zatim

Poziv makronaredbe 1: Izlaz iz Sub

ElseIf GetAsyncKeyState(vbKeyControl) Zatim

Poziv makronaredbe 2: Izlaz iz Sub

Prvi red je kao "rezerviranje" API funkcije za korištenje u VBA programu. Može se vidjeti da se funkcija GetAsyncKeyState poziva iz biblioteke (datoteka koja sadrži programe namijenjene samo za korištenje od strane drugih programa) user32.dll, a broj ključa se prosljeđuje ovoj funkciji, a ona vraća cijeli broj (tj. 0, ako je tipka s odgovarajućim brojem nije pritisnuta, a -32767 ili 1 ako je pritisnuta). Bilo koja funkcija ili procedura pozvana iz biblioteka koje nisu VBA moraju biti tako rezervirane pomoću naredbe Declare.

Izraz vbKeyShift u naredbi zamjena je za kod tipke Shift (njegova vrijednost je 16), a vbKeyControl, kao što je lako razumjeti, zamjena je za kod tipke Control. Čini se da je struktura naredbi "If...Then" jasna 3, ali ako nije, pogledajte VBA pomoć. Naredba Call prije naziva makronaredbe, kao što se sjećate, znači njegovo pokretanje.

Na internetu postoje ruske stranice posvećene API 4. Posjetite ih kako biste saznali više o ovom skupu značajki.

Prema definiciji iz Wikipedije, API je skup gotovih klasa, procedura, funkcija, struktura i konstanti koje daje aplikacija (biblioteka, usluga) za korištenje u vanjskim softverskim proizvodima. Koriste ga programeri za pisanje svih vrsta aplikacija.

Ali budući da velik dio Wikipedije nije razumljiv mnogim ljudima, pokušat ću laičkim rječnikom objasniti što je API te za što se obično pravi i kako se koristi.

API-ji su potpuno različiti, ali kao primjer sam odabrao situaciju u kojoj imamo mrežu trgovina i samo jednu zajedničku bazu podataka. Zamislite da posjedujete affiliate program. Affiliate program radi na sljedećem principu: osoba se registrira u affiliate program i dobiva store engine. Tada može instalirati ovu trgovinu na svoj hosting i početi raditi. Ali svi podaci o ovoj trgovini preuzeti su iz naše baze podataka, odnosno svakom partneru moramo dati pristup našoj dragocjenoj bazi podataka. Možete li zamisliti koliko je ovo opasno? Uostalom, moramo otvoriti pristup bazi podataka izvana kako bi sve partnerske trgovine mogle raditi s njom. Što se događa ako vaši pristupni podaci padnu u ruke kriminalaca?

Tu će nam API pomoći. Umjesto davanja pristupa bazi, jednostavno ćemo napraviti API preko kojeg će partnerske trgovine primati informacije. Na ovaj način će samo naša API skripta raditi s bazom podataka, a trgovine će raditi s ovom skriptom.

Kako radi?
Na primjer, trgovina šalje zahtjev našem API-ju
http://ourapi.com/get_books?limit=20
i naš API razumije da treba dati popis knjiga koji se sastoji od 20 kopija, jer smo prošli parametar ograničenja koji je jednak 20. Naša skripta (API) šalje zahtjev bazi podataka, prima popis knjiga i vraća ih u pohranjuje (zapravo, samo prikazuje ) u određenom formatu. Format u kojem API vraća informacije može biti apsolutno bilo koji, glavna stvar je da ga naše trgovine razumiju. To može biti JSON, serijalizirano polje ili XML. Ovo više nije važno, glavno je da razumijete princip.

Sami definirate skup naredbi koje API razumije. Na primjer, u našem slučaju to mogu biti naredbe kao što su dobivanje popisa knjiga, dobivanje popisa kategorija, dobivanje popularnih knjiga, dobivanje novih knjiga itd. Na ovaj način, čak i ako napadač dobije priliku pristupiti našem API-ju, sve što može učiniti je dobiti popis knjiga, a to ne predstavlja nikakvu prijetnju našoj bazi podataka.

Nadam se da sam na jednostavnom primjeru uspio objasniti što je API. Ako imate pitanja, postavite ih u komentarima ili na forumu, a mi ćemo vam rado pomoći da ih riješite.

Windows API - skup funkcija operacijskog sustava

Skraćenica API mnogim se programerima početnicima čini vrlo tajanstvenom, pa čak i zastrašujućom. Zapravo, sučelje za programiranje aplikacija (API) samo je neki gotov skup funkcija koje razvijači aplikacija mogu koristiti. Općenito, ovaj koncept je ekvivalent onome što se ranije češće nazivalo knjižnicom potprograma. Međutim, API se obično odnosi na posebnu kategoriju takvih biblioteka.

Tijekom razvoja gotovo svake prilično složene aplikacije (MyApplication) za krajnjeg korisnika, formira se skup specifičnih internih funkcija koje se koriste za implementaciju ovog određenog programa, koji se naziva MyApplication API. Međutim, često se ispostavi da se te funkcije mogu učinkovito koristiti za izradu drugih aplikacija, uključujući i druge programere. U ovom slučaju, autori, na temelju strategije za promicanje svog proizvoda, moraju odlučiti o pitanju: otvaraju li pristup ovom skupu vanjskim korisnicima ili ne? Ako je odgovor potvrdan, fraza "Paket uključuje otvoreni skup API funkcija" pojavljuje se u opisu softverskog paketa kao pozitivna karakteristika (ali ponekad za dodatni novac).

Stoga se API najčešće odnosi na skup funkcija koje su dio jedne aplikacije, ali su također dostupne za korištenje u drugim programima. Na primjer, Excel, uz svoje sučelje za krajnjeg korisnika, ima skup Excel API funkcija koje se mogu koristiti, posebice, pri izradi aplikacija pomoću VB-a.

Sukladno tome, Windows API je skup funkcija koji je dio samog operativnog sustava i istovremeno dostupan bilo kojoj drugoj aplikaciji, uključujući i one napisane pomoću VB-a. U tom smislu sasvim je opravdana analogija s BIOS/DOS skupom prekida sustava koji je zapravo DOS API.

Razlika je u tome što je raspon Windows API funkcija, s jedne strane, puno širi u usporedbi s DOS-om, as druge strane ne uključuje mnoge alate za izravno upravljanje računalnim resursima koji su bili dostupni programerima u prethodnim OS. Osim toga, pozivi prema Windows API-ju izvode se korištenjem običnih proceduralnih poziva, a pozivi funkcijama DOS-a izvode se putem posebne instrukcije procesora pod nazivom Interrupt.

Zašto nam je potreban Win API za VB programere?

Unatoč činjenici da VB ima veliki izbor funkcija, u procesu više ili manje ozbiljnog razvoja otkriva se da njihove mogućnosti često nisu dovoljne za rješavanje potrebnih problema. U isto vrijeme, programeri početnici često se počinju žaliti na nedostatke VB-a i razmišljaju o promjeni alata, ne sumnjajući da njihovo računalo ima ogroman skup alata i samo ih trebaju znati koristiti.

Prilikom upoznavanja s Win API-jem, otkriva se da mnoge ugrađene VB funkcije nisu ništa drugo nego pozivi odgovarajućih sistemskih procedura, već samo implementirani u obliku sintakse određenog jezika. Uzimajući ovo u obzir, potreba za korištenjem API-ja određena je sljedećim opcijama:

  1. API funkcije koje su u potpunosti implementirane kao ugrađene VB funkcije. Ipak, ponekad je u ovom slučaju korisno prebaciti se na korištenje API-ja, jer to ponekad može značajno poboljšati performanse (osobito zbog nepostojanja nepotrebnih transformacija proslijeđenih parametara).
  2. Ugrađene VB funkcije implementiraju samo poseban slučaj odgovarajuće API funkcije. Ovo je prilično uobičajena opcija. Na primjer, CreateDirectory API funkcija ima više mogućnosti od ugrađenog VB MkDir operatora.
  3. Ogroman broj API funkcija uopće nema analoga u trenutnoj verziji VB jezika. Na primjer, ne možete izbrisati imenik koristeći VB - da biste to učinili morate koristiti funkciju DeleteDirectory.

Također treba naglasiti da se neke API funkcije (njihov udio u Win API-ju je vrlo mali) ne mogu pozvati iz VB programa zbog niza jezičnih ograničenja, na primjer, zbog nemogućnosti rada s memorijskim adresama. Ali u nekim slučajevima mogu pomoći netrivijalne tehnike programiranja (osobito u slučaju istih adresa).

Autorovo osobno stajalište je sljedeće - umjesto širenja ugrađenih funkcija VB-a iz verzije u verziju, treba dati dobar opis najpopularnijih API funkcija. Istodobno, želio bih savjetovati programerima da ne čekaju da se pojavi nova verzija alata s proširenim funkcijama, već da pomnije pogledaju sastav postojećeg Win API-ja - vjerojatno je da su mogućnosti koje su vam potrebne mogao biti implementiran već u verziji VB 1.0, objavljenoj 1991.

Kako naučiti Win API

Ovo i nije tako jednostavno pitanje s obzirom da se broj Win32 API funkcija procjenjuje na oko 10 tisuća (nitko ne zna točnu brojku, pa ni Microsoft).

VB (verzije 4-6) uključuje datoteku koja opisuje Win API deklaracije - WIN32API.TXT (kasnije ćemo vam reći više o njenoj upotrebi). Ali, prvo, uz njegovu pomoć možete dobiti informacije o svrsi određene funkcije i njezinim parametrima samo prema korištenim mnemoničkim imenima, a drugo, popis funkcija u ovoj datoteci daleko je od potpune. Jedno vrijeme (prije sedam godina), VB 3.0 je imao posebne datoteke pomoći koje su opisivale funkcije Win16 API-ja. Međutim, već u v.4.0 ove korisne informacije s praktičnim sučeljem su nestale.

Sveobuhvatne informacije o Win32 API-ju mogu se pronaći u pomoći za Platform Software Development Kit, koja je uključena u MSDN Library CD-ove uključene u VB 5.0 i 6.0 Enterprise Edition i Office 2000 Developer Edition. Međutim, tamo pronaći potrebne informacije i razumjeti ih nije nimalo lako. Da ne spominjem da su svi opisi tamo dani u odnosu na C jezik.

U svijetu su općepriznate knjige poznatog američkog stručnjaka Daniela Applemana za učenje API programiranja u VB okruženju. Njegov Dan Appleman's Visual Basic Programmer's Guide to the Windows API series (za Win16, Win32 i razne verzije VB-a) jedna je od najprodavanijih knjiga za VB programere od 1993. godine. Knjigu Dan Appleman’s VB 5.0 Programmer’s Guide to the Win32 API, objavljenu 1997., autoru je iz SAD-a donio prijatelj koji ju je pronašao u prvoj knjižari malog provincijskog grada.

Ova knjiga ima više od 1500 stranica, pokrivajući općenite tehnike programiranja API-ja u VB-u, kao i preko 900 funkcija. Priloženi CD sadrži puni tekst knjige i sve primjere programa, kao i nekoliko dodatnih poglavlja koja nisu uključena u tiskanu verziju. Godine 1999. Dan Appleman izdao je novu knjigu, Dan Appleman's Win32 API Puzzle Book and Tutorial for Visual Basic Programmers, koja uključuje informacije o još 7600 funkcija (iako ne toliko opsežne).

Win API i biblioteka dinamičkih veza (DLL)

Win API skup implementiran je u obliku dinamičkih DLL-ova. Zatim ćemo zapravo govoriti o tehnologiji korištenja DLL-ova u VB okruženju na primjeru biblioteka uključenih u Win API. Međutim, kada govorimo o DLL-ovima, potrebno je istaknuti nekoliko važnih točaka.

U ovom slučaju, pod DLL-om mislimo na tradicionalnu verziju binarnih dinamičkih knjižnica, koje aplikacijama omogućuju izravan pristup potrebnim procedurama - potprogramima ili funkcijama (na sličan način kao što se događa pri pozivanju procedura unutar VB projekta). Takve biblioteke mogu se stvoriti pomoću različitih alata: VC++, Delphi, Fortran, osim VB-a (da vidimo što se pojavljuje u verziji 7.0) - potonji može stvoriti samo ActiveX DLL-ove, kojima se pristupa preko OLE Automation sučelja.

Tipično datoteke dinamičke biblioteke imaju ekstenziju .DLL, ali to uopće nije potrebno (za Win16 često se koristi ekstenziju .EXE); upravljački programi vanjskih uređaja označeni su pomoću .DRV.

Kao što smo već napomenuli, prilično je teško odrediti točan broj Windows API funkcija i datoteka koje ih sadrže, ali sve se nalaze u direktoriju sustava. U tom smislu, bolje je istaknuti sastav biblioteka uključenih u jezgru operativnog sustava i glavne biblioteke s ključnim dodatnim funkcijama.

A sada nekoliko savjeta.

Savjet 1. Provjerite je li vaš DL oglas ispravno formatiran L-postupci

Sam poziv DLL procedurama u programu izgleda potpuno isto kao i "običnim" Visual Basic procedurama, na primjer:

Poziv DllName([popis argumenata])

Međutim, da biste koristili vanjske DLL funkcije (uključujući Win API), one moraju biti deklarirane u programu pomoću naredbe Declare, koja izgleda ovako:

Declare Sub ProcedureName Lib _ “LibraryName” _ [([ArgumentList])]

Deklarirajte funkciju FunctionName _ Lib “LibraryName” _ [([ArgumentList])]

Ovdje su opcijski elementi operatora prikazani u uglatim zagradama, varijabilni izrazi su u kurzivu, a preostale riječi su ključne riječi. Sustav pomoći daje prilično dobar opis sintakse operatora, tako da ćemo za sada primijetiti samo nekoliko točaka.

Deklaracije vanjskih funkcija treba staviti u odjeljak Opće deklaracije modula. Ako ga postavite u modul obrasca, tada morate navesti ključnu riječ Private (ova će deklaracija biti dostupna samo unutar ovog modula) - ovo je ograničenje za sve postupke modula obrasca.

Skup Win32 API implementiran je samo u obliku funkcija (Win16 API je imao mnogo podrutina). Uglavnom se radi o funkcijama tipa Long koje najčešće vraćaju kod završetka operacije.

Operator Declare pojavio se u MS Basicu još u doba DOS-a, a koristio se i za deklariranje internih projektnih procedura. U Visual Basicu to nije potrebno, budući da je deklaracija internih procedura automatski njihova pod ili deklaracija funkcije. U usporedbi s Basic/DOS-om, novi opis mora naznačiti naziv datoteke biblioteke u kojoj se nalazi potrebna procedura. Wip API biblioteke nalaze se u direktoriju sustava Windows, pa je dovoljno navesti samo naziv datoteke. Ako pristupate DLL-u koji se nalazi na nasumičnom mjestu, morate zapisati punu stazu do te datoteke.

Opis naredbe Declare obično zauzima dosta prostora i ne stane u jedan red u prozoru koda. Stoga preporučamo da se pridržavate određene sheme prijeloma redaka kada pišete aplikacije, na primjer:

Deklarirajte funkciju GetTempPath _ Lib “kernel32” Alias ​​​​“GetTempPathA” _ (ByVal nBufferLength As Long, _ ByVal lpBuffer As String) As Long

U ovom slučaju, svi glavni elementi opisa smješteni su u različite retke i stoga su laki za čitanje.

Savjet 2: Budite posebno oprezni kada radite s DLL funkcijama

Korištenje Win API-ja i raznih DLL funkcija značajno proširuje funkcionalnost VB-a i često poboljšava performanse programa. Međutim, cijena koju treba platiti za to je rizik smanjenja pouzdanosti aplikacije, posebno tijekom njenog otklanjanja pogrešaka.

Jedna od najvažnijih prednosti VB okruženja je pouzdanost procesa razvoja programa: radeći pod kontrolom tumača, programski kod teoretski ne može poremetiti rad Windowsa i samog VB-a. Programer možda neće paziti na ispravnost prosljeđivanja parametara pozvanim funkcijama - takve će pogreške lako otkriti sam tumač bilo tijekom procesa prevođenja koda ili tijekom njegovog izvođenja. U najneugodnijem slučaju, način obrade jednostavno će se prekinuti, uz naznaku gdje i zašto je došlo do pogreške.

Korištenje Windows API funkcija ili drugih DLL-ova izravno uklanja takvu kontrolu nad prijenosom podataka i procesom izvršavanja koda izvan VB okruženja. Stoga pogreška u pristupu vanjskim funkcijama može dovesti do neoperabilnosti i VB-a i operativnog sustava. To je osobito istinito u fazi razvoja programa, kada je prisutnost pogrešaka sasvim prirodna. Dakle, korištenjem širih mogućnosti funkcija osnovnog sloja sustava, programer preuzima odgovornost za njihovu ispravnu upotrebu.

Problem je dodatno pogoršan činjenicom da različiti programski jezici koriste različite načine prosljeđivanja parametara između procedura. (Točnije, različite metode prosljeđivanja koriste se prema zadanim postavkama, budući da mnogi jezici mogu podržavati više metoda.) Win API-ji implementirani su u C/C++ i koriste C/C++ konvencije prosljeđivanja parametara koje se razlikuju od uobičajene VB verzije.

U tom smislu treba napomenuti da je pojava analoga API funkcija ugrađenih u VB opravdana upravo prilagodbom potonjeg VB sintaksi i implementacijom odgovarajućeg mehanizma kontrole razmjene podataka. Napomenimo i da je u fazi eksperimentalnog otklanjanja pogrešaka aplikacije prilikom izrade izvršnog modula bolje koristiti opciju kompilacije P-koda umjesto izvornog koda (strojnog koda). U prvom slučaju, program će se izvoditi pod kontrolom tumača - sporije u usporedbi sa strojnim kodom, ali pouzdaniji sa stajališta mogućeg pogrešnog utjecaja na operativni sustav i pružajući prikladniji način za prepoznavanje mogućih pogrešaka.

Savjet 3: Deset savjeta Dana Applemana za robusno API programiranje u VB-u

Korištenje API funkcije zahtijeva pažljivije programiranje korištenjem nekih manje poznatih tehnika pozivanja procedura (u usporedbi s VB). Nastavit ćemo se baviti ovim problemima u nastavku. A sada predstavljamo sažetak savjeta koje je na ovu temu formulirao Dan Appleman (njihova prva verzija pojavila se još 1993. godine) s nekim našim dodacima i komentarima.

1. Zapamtite ByVal. Najčešća pogreška pri pristupu API i DLL funkcijama je netočna upotreba ključne riječi ByVal: ili je zaborave staviti ili je, obrnuto, stave kada nije potrebna.

Ovi primjeri pokazuju utjecaj operatora ByVal na prosljeđivanje parametara

Vrsta parametra Uz ByVal Bez ByVal-a
Cijeli broj 16-bitni cijeli broj se gura na stog 32-bitna adresa 16-bitnog cijelog broja gura se na stog
dugo 32-bitni cijeli broj se gura na stog 32-bitna adresa 32-bitnog cijelog broja gura se na stog
Niz Niz se pretvara u format koji se koristi u C-u (podaci i završni nulti bajt). 32-bitna adresa novog retka gura se na stog Ručka VB niza gura se na stog. (Sam Windows API nikada ne koristi takve ručke i prepoznaju se samo u DLL-ovima implementiranim posebno za VB.)

Ovdje treba podsjetiti da se prosljeđivanje parametara u bilo kojem programskom sustavu, uključujući VB, izvodi na dva glavna načina: po referenci (ByRef) ili po vrijednosti (ByVal). U prvom slučaju prosljeđuje se adresa varijable (ova se opcija koristi prema zadanim postavkama u VB), u drugom - njezina vrijednost. Temeljna razlika je u tome što se korištenjem reference promijenjena vrijednost proslijeđenog parametra vraća pozivnom programu.

Da biste to razumjeli, provedite eksperiment pomoću sljedećih programa:

Dim v As Integer v = 2 Call MyProc(v) MsgBox “v = “ & v Sub MyProc (v As Integer) v = v + 1 End Sub

Kada pokrenete ovaj primjer, dobit ćete poruku s vrijednošću varijable jednakom 3. Činjenica je da se u ovom slučaju adresa varijable v, fizički stvorena u pozivnom programu, prosljeđuje potprogramu MyProc. Sada promijenite opis postupka u

Sub MyProc (ByVal v As Integer)

Kao rezultat toga, prilikom izvođenja testa dobit ćete v = 2, jer se proceduri prosljeđuje samo početna vrijednost varijable - rezultat operacija izvedenih na njoj ne vraća se pozivnom programu. Način prijenosa po vrijednosti također se može promijeniti pomoću operatera poziva na sljedeći način:

Sub MyProc (v As Integer) ... Call MyProc((v)) ‘ (v) - zagrade označavaju način prijenosa po vrijednosti.

Međutim, kada se pristupa internim VB procedurama, upotreba ključne riječi ByVal u Call izjavi je zabranjena - umjesto nje se koriste zagrade. Za to postoji objašnjenje.

U klasičnom slučaju (C, Fortran, Pascal), razlika između načina rada ByRef i ByVal ovisi o tome što se točno nalazi na stogu za razmjenu podataka - adresa varijable ili njezina vrijednost. Basic povijesno koristi varijantu emulacije softvera ByVal - uvijek postoji adresa na stogu, ali samo kada se prosljeđuje vrijednost, za to se stvara privremena varijabla. Kako bi se napravila razlika između ove dvije opcije (Classic i Basic), koriste se različiti načini opisa ByVal moda. Imajte na umu da oponašanje načina rada ByVal u VB-u osigurava veću pouzdanost programa: miješanjem oblika reference, programer riskira samo da će ispravljena vrijednost varijable biti vraćena (ili da se neće vratiti) programu koji poziva. U "klasičnoj" verziji, takva zabuna može dovesti do fatalne pogreške prilikom izvršavanja procedure (na primjer, kada se vrijednost varijable jednaka, recimo, nuli, koristi umjesto memorijske adrese).

DLL funkcije su implementirane prema “klasičnim” principima i stoga zahtijevaju obvezni opis načina razmjene podataka sa svakim od argumenata. U tu svrhu služe deklaracije funkcija kroz opis Declare (točnije, popis proslijeđenih argumenata). Najčešći način za prosljeđivanje parametara Windows API funkciji ili DLL-u je korištenje ključne riječi ByVal. Štoviše, može se odrediti i u operatoru Declare i izravno prilikom pozivanja funkcije.

Posljedice netočnog prosljeđivanja parametara lako je predvidjeti. Ako primite očito nevažeću adresu, primit ćete poruku GPF (General Protection Fault). Ako funkcija primi vrijednost koja odgovara valjanoj adresi, tada će API funkcija ući u strano područje (na primjer, jezgru sustava Windows) sa svim posljedičnim katastrofalnim posljedicama.

2. Provjerite vrstu parametara koji se prosljeđuju. Točan broj i vrsta proslijeđenih parametara jednako su važni. Potrebno je da argumenti deklarirani u Declare odgovaraju očekivanim parametrima u API funkciji. Najčešći slučaj pogreške u prosljeđivanju parametara uključuje razliku između NULL i niza nulte duljine - zapamtite da to nije ista stvar.

3. Provjerite vrstu povrata.

VB je prilično tolerantan prema neusklađenosti tipa povrata funkcije, budući da se numeričke vrijednosti obično vraćaju kroz registre, a ne kroz stog. Sljedeća pravila pomoći će odrediti ispravnu vrijednost koju vraća API funkcija:

  • DLL funkcija koja ne vraća vrijednost (analogno void u 'C') mora biti deklarirana kao VB Sub.
  • API funkcija koja vraća cjelobrojnu vrijednost (Integer ili Long) može se definirati ili kao Sub ili kao funkcija koja vraća vrijednost odgovarajućeg tipa.
  • Niti jedna API funkcija ne vraća brojeve s pomičnim zarezom, ali neki DLL-ovi mogu vratiti ovu vrstu podataka.

4. S velikom pažnjom koristite konstrukciju "As Any". Mnoge Windows API funkcije imaju mogućnost prihvaćanja parametara različitih tipova i za to koriste konstrukciju As Any (interpretacija tipa izvodi se ovisno o vrijednosti drugih proslijeđenih parametara).

Dobro rješenje u ovom slučaju može biti korištenje nekoliko aliasa (Alias) funkcije stvaranjem dvije ili više deklaracija za istu funkciju, pri čemu svaka deklaracija specificira parametre određene vrste.

5. Ne zaboravite inicijalizirati nizove. Postoji mnogo funkcija u Win API-ju koje vraćaju informacije učitavanjem podataka u međuspremnike nizova proslijeđenih kao parametar. U svom programu naizgled možete učiniti sve ispravno: ne zaboravite na ByVal, ispravno proslijedite parametre funkciji. Ali Windows ne može provjeriti kolika je veličina memorije dodijeljene retku. Veličina retka mora biti dovoljno velika da primi sve podatke koji se u njega mogu smjestiti. Odgovornost za rezerviranje međuspremnika potrebne veličine leži na VB programeru.

Treba napomenuti da se u 32-bitnom sustavu Windows, kada se koriste nizovi, konverzija provodi iz Unicode (dvobajtno kodiranje) u ANSI (jednobajtno kodiranje) i natrag, uzimajući u obzir postavke nacionalnog sustava. Stoga, za rezerviranje međuspremnika, ponekad je prikladnije koristiti nizove bajtova umjesto string varijabli. (Više o tome u nastavku.)

Najčešće vam Win API funkcije omogućuju da sami definirate maksimalnu veličinu bloka. Konkretno, ponekad to zahtijeva pozivanje druge API funkcije koja će "reći" veličinu bloka. Na primjer, GetWindowTextLength omogućuje određivanje duljine niza potrebnog za držanje naslova prozora koji vraća funkcija GetWindowText. U ovom slučaju Windows osigurava da ne pretjerate.

6. Svakako koristite Option Explicit.

7. Pažljivo provjerite vrijednosti parametara i povratne vrijednosti. VB ima dobre mogućnosti provjere tipa. To znači da kada pokušate proslijediti nevažeći parametar VB funkciji, najgore što se može dogoditi je da dobijete poruku o pogrešci od VB. Ali ovaj mehanizam, nažalost, ne radi kada se pristupa funkcijama Windows API-ja.

Windows 9x ima poboljšanu provjeru parametara za većinu API funkcija. Stoga prisutnost pogreške u podacima obično ne uzrokuje fatalnu pogrešku, ali nije lako utvrditi što ju je uzrokovalo.

Ovdje preporučujemo korištenje nekoliko načina za otklanjanje pogrešaka ove vrste pogreške:

  • Upotrijebite korak-po-korak način otklanjanja pogrešaka ili naredbu Debug.Print za provjeru svakog sumnjivog poziva API funkcije. Provjerite rezultate ovih poziva kako biste bili sigurni da je sve normalno i da je funkcija ispravno dovršena;
  • koristite Windows program za ispravljanje pogrešaka kao što je CodeView i verziju sustava Windows za ispravljanje pogrešaka (dostupnu u Windows SDK-u). Ovi alati mogu otkriti pogrešku parametra i barem odrediti koja API funkcija uzrokuje pogrešku;
  • Koristite dodatne alate trećih strana za provjeru vrsta parametara i valjanosti njihovih vrijednosti. Takvi alati ne samo da mogu pronaći greške u parametrima, već čak i ukazati na liniju VB koda gdje se pogreška dogodila.

Osim toga, potrebno je provjeriti rezultat izvršavanja API funkcije.

8. Zapamtite da cijeli brojevi u VB-u iu Windowsima nisu ista stvar. Prije svega, trebate imati na umu da pojam “Integer” u VB-u označava 16-bitni broj, dok u Win 32 dokumentaciji označava 32-bitni broj. Drugo, cijeli brojevi (Integer i Long) u VB su količine s predznakom (to jest, jedna znamenka se koristi kao znak, a ostatak kao mantisa broja), u Windowsima se koriste samo nenegativni brojevi. Ovu okolnost morate imati na umu kada formirate proslijeđeni parametar pomoću aritmetičkih operacija (na primjer, izračunavanje adrese zbrajanjem neke baze i pomaka). Standardne VB aritmetičke funkcije nisu prikladne za to. Što učiniti u ovom slučaju, razgovarat ćemo zasebno.

9. Obratite veliku pozornost na nazive funkcija. Za razliku od Win16, imena svih Win32 API funkcija osjetljiva su na točnu upotrebu malih i velikih slova (to nije bio slučaj u Win16). Ako negdje koristite malo slovo umjesto velikog ili obrnuto, tada željena funkcija neće biti pronađena. Također pazite da pravilno koristite sufiks A ili W u funkcijama koje koriste parametre niza. (Više o tome pogledajte u nastavku.)

10. Često spremajte svoj rad. Pogreške povezane s neispravnom upotrebom DLL-ova i Win API-ja mogu dovesti do hitnog prekida VB okruženja, a možda i cijelog operativnog sustava. Trebali biste osigurati da je kod koji pišete spremljen prije probnog rada. Najjednostavnije je postaviti način rada za automatsko snimanje projektnih modula prije pokretanja projekta u VB okruženju.

Nakon što ste pročitali prethodni savjet, možda ćete pomisliti da je korištenje Win API funkcija riskantno. To je donekle točno, ali samo u usporedbi sa sigurnim programiranjem koje pruža sam VB. Ali uz vještu upotrebu i poznavanje mogućih zamki, ovaj rizik je minimalan. Osim toga, često je jednostavno nemoguće potpuno napustiti korištenje Win API-ja - oni će i dalje biti potrebni za bilo kakav ozbiljan razvoj.

Osim toga, prethodno smo spomenuli zamke za široku klasu DLL-ova. U slučaju Win API-ja, sve je puno jednostavnije, jer je obrazac za pristup ovim funkcijama jasno unificiran. Treba imati na umu sljedeće glavne točke:

  1. Win32 API funkcije su upravo to: funkcije, odnosno procedure tipa Function (bilo je mnogo Sub rutina u Win16 API-ju). Sve su to funkcije tipa Long, pa su njihovi opisi napisani u sljedećem obliku: Declare Function name ... Kako je Long 'tip funkcije _ definiran eksplicitno

    Naziv deklaracije funkcije& ' tip funkcije _ određuje se pomoću sufiksa

    Poziv API funkciji izgleda ovako:

Rezultat& = ImeApi& ([ Popis argumenata]
  1. Najčešće, povratna vrijednost funkcije je kod završetka operacije. Štoviše, vrijednost različita od nule u ovom slučaju znači normalan završetak, a nula znači pogrešku. Obično (ali ne uvijek) možete razjasniti prirodu pogreške pozivanjem funkcije GetLastError. Opis ove funkcije izgleda ovako: Declare Function GetLastError& Lib “kernel32” ()

    PAŽNJA! Kada radite u VB-u, bolje je koristiti svojstvo LastDLLError objekta Err za dobivanje vrijednosti kvalificiranog koda pogreške, budući da VB ponekad resetira funkciju GetLastError između pozivanja API-ja i nastavka izvršavanja programa.

    Možete interpretirati kod koji vraća GelLastError pomoću konstanti zapisanih u datoteci API32.TXT, s imenima koja počinju sufiksom ERROR_.

    Najčešće pogreške imaju sljedeće kodove:

    • ERROR_INVALID_HANDLE = 6& - nevažeća oznaka
    • ERROR_CALL_NOT_IMPLEMENTED = 120& - pozivanje funkcije u Windows 9x koja je dostupna samo za Windows NT
    • ERROR_INVALID_PARAMETER = 87& - netočna vrijednost parametra

    Međutim, mnoge funkcije vraćaju vrijednost nekog traženog parametra (na primjer, OpenFile vraća vrijednost rukovatelja datotekom). U takvim slučajevima pogrešku određuje neka druga posebna vrijednost Return&, najčešće 0 ili –1.

  2. Win32 API-ji koriste strogo fiksne načine za prijenos najjednostavnijih vrsta podataka. a) ByVal...As Long

    Najmanje 80% prosljeđivanja argumenata obavlja se pomoću dugih varijabli. Imajte na umu da argument Stalno je popraćen ključnom riječi ByVal, a to između ostalog znači da se vrši jednosmjerni prijenos podataka - od VB programa do API funkcije.

    B) ByVal...Kao niz

    Ova vrsta prijenosa podataka također se događa prilično često, i to s argumentom Stalno Primjenjuje se ByVal. Kada se pozove API funkcija, adresa niza se upisuje u stog, tako da je u ovom slučaju moguća dvosmjerna razmjena podataka. Postoji nekoliko opasnosti kojih morate biti svjesni kada radite sa žicama.

    Prvi je da se rezervacija memorije za niz vrši u programu koji poziva, pa ako API funkcija ispunjava nizove, tada morate stvoriti niz potrebne veličine prije nego što ga pozovete. Na primjer, funkcija GetWindowsDirectory vraća put do Windows direktorija, koji po definiciji ne smije imati više od 144 znaka. Sukladno tome, pozivanje ove funkcije trebalo bi izgledati otprilike ovako:

    WinPath$ = Space$(144) ' rezervirajte niz od _ 144 znaka Result& = GetWindowsDirectory& (WinTath$, 144) _ ' punjenje međuspremnika ' Result& - stvarni broj znakova u nazivu direktorija _ WinPath$ = Left$(WinPath, Result& )

    Drugi problem je što se prilikom poziva API funkcije izvorni string pretvara u neku internu reprezentaciju, a prilikom izlaska iz funkcije obrnuto. Ako se u danima Win16 ova operacija sastojala samo od dodavanja nultog bajta na kraju retka, onda je s dolaskom Win32 to dodano transformaciji dvobajtnog Unicode kodiranja u ANSI i obrnuto. (O tome se detaljno raspravljalo u članku “Značajke rada s varijablama niza u VB-u”, ComputerPress 10’99 i 01’2000). Za sada samo napomenimo da korištenjem ByVal ... Kao String konstrukcije, možete razmjenjivati ​​nizove samo sa znakovnim podacima.

    B) ...Kao i bilo koji

    To znači da će neka adresa memorijskog međuspremnika biti gurnuta na stog, čiji će sadržaj biti interpretiran od strane API funkcije, na primjer, ovisno o vrijednosti drugih argumenata. Međutim, As Any može se koristiti samo u izjavi Declare - kada se poziva određena funkcija, određena varijabla mora biti definirana kao argument.

    D) ... Kao UserDefinedType

    Ovaj dizajn se također često koristi kada je potrebno razmijeniti podatke (općenito u oba smjera) pomoću neke strukture. Zapravo, ova konstrukcija je vrsta konkretne implementacije oblika prijenosa As Any, samo što je u ovom slučaju funkcija konfigurirana na fiksnu strukturu.

    Oblik strukture podataka određen je specifičnom API funkcijom, a programerova je odgovornost da je ispravno opiše i rezervira u pozivnom programu. Ovaj dizajn Stalno koristi se bez riječi ByVal, odnosno u ovom slučaju se vrši prijenos po referenci - adresa varijable se upisuje na stog.

Primjer pozivanja API funkcije

Ilustrirajmo gore navedeno na primjeru korištenja dviju korisnih funkcija za rad s datotekama - lopen i lread, koje su opisane na sljedeći način:

Deklarirajte funkciju lopen Lib “kernel32” _ Alias ​​​​“_lopen” (_ ByVal lpFileName As String, _ ByVal wReadWrite As Long) Kao Long Deklarirajte funkciju lread Lib “kernel32” _ Alias ​​​​“_lread” (_ ByVal hFile As Long, lpBuffer As Any, _ ByVal wBytes As Long) Kao Long

U VB-u, njihovi analozi - u ovom slučaju točni - su operatori Open i Get (za binarni način). Odmah obratimo pozornost na korištenje ključne riječi Alias ​​u deklaraciji funkcije - to je upravo slučaj kada ne možete bez nje. Stvarni nazivi funkcija u biblioteci počinju podvlakom (tipičan stil jezika C), što nije dopušteno u VB.

Operacija otvaranja datoteke može izgledati ovako:

Const INVALID_HANDLE_VALUE = -1 ' netočna _ vrijednost deskriptora lpFileName$ = “D:\calc.bas” ' naziv datoteke wReadWrite& = 2 ' način čitanja i pisanja hFile& = lopen(lpFileName$, wReadWrite&) _ ' definirajte deskriptor datoteke Ako je hFile& = INVALID_HANDLE_VALUE Zatim _ ' pogreška pri otvaranju datoteke ' navedite šifru pogreške CodeError& = Err.LastDllError 'CodeError& = GetLastError _ ' ova konstrukcija ne radi End If

Ovdje morate obratiti pozornost na dvije točke:

  • kao vrijednost funkcije dobivamo vrijednost deskriptora datoteke. Greška odgovara vrijednosti –1;
  • Upravo u ovom slučaju pozivanje funkcije GetLastError ne funkcionira - da bismo dobili pročišćenu vrijednost pogreške, okrenuli smo se Err objektu (gore smo govorili o mogućnosti takve situacije).

Sadržaj datoteke tada se može pročitati, ali to pretpostavlja da programer mora imati određeno razumijevanje njezine strukture (baš kao što je slučaj kod rada s proizvoljnim binarnim datotekama). U ovom slučaju, pozivanje funkcije lread može izgledati ovako:

Dim MyVar As Single wBytes = lread (hFile&, MyVar, Len(MyVar) ' čitanje realnog broja, 4 bajta ' wBytes je broj stvarno pročitanih podataka, ' -1 je pogreška... Upišite MyStruct x As Single i As Integer End Type Dim MyVar As MyStruct wBytes = lread (hFile&, MyVar, Len(MyVar)) ' čitanje strukture podataka, 6 bajtova

Napominjemo još jednom: drugi argument funkcije prosljeđuje se referencom, ostali se prosljeđuju prema vrijednosti.

Dim MyVar As String MyVar = Space$(10) 'rezerviraj varijablu za 10 znakova wBytes = lread (hFile&, ByVal MyVar, Len(MyVar)) 'čitaj niz znakova, 10 znakova

Ovdje se vidi bitna razlika u odnosu na prethodni primjer - string varijablu obavezno prati ključna riječ ByVal.

Čitanje sadržaja datoteke u nizu (radi jednostavnosti koristit ćemo jednodimenzionalni niz bajtova) vrši se na sljedeći način:

Dim MyArray(1 To 10) As Byte wBytes = lread (hFile&, MyArray(1), _ Len(MyArray(1))* 10) ' čitanje 10 elemenata niza

Određivanjem prvog elementa niza kao argumenta, prosljeđujemo adresu početka memorijskog područja rezerviranog za niz. Očito, možete ispuniti bilo koji fragment niza na ovaj način:

WBytes = lread (hFile&, MyArray(4), _ Len(MyArray(1))* 5) ‘ čitanje elemenata niza 4 do 8

Savjet 5: Koristite Alias ​​​​za Gears i parametri As Any

Ovdje ćemo na temelju prethodnog primjera otkriti bit četvrtog savjeta Dana Applemana.

Kada radite s funkcijom lread, trebali biste zapamtiti da kada joj pristupate pomoću varijable niza, morate koristiti ključnu riječ ByVal (inače ćete primiti poruke o ilegalnoj operaciji). Da biste se zaštitili, možete napraviti dodatni poseban opis iste funkcije za rad samo s varijablama niza:

Deklarirajte funkciju lreadString Lib “kernel32” _ Alias ​​​​“_lread” (_ ByVal hFile As Long, ByVal lpBuffer As String, _ ByVal wBytes As Long) Sve dok

Kada radite s ovim opisom, više ne morate navoditi ByVal kada kontaktirate:

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

Čini se da sintaksa operatora Declare omogućuje izradu sličnog posebnog opisa za niz:

Deklarirajte funkciju lreadString Lib “kernel32” Alias ​​​​“_lread” (_ ByVal hFile As Long, lpBuffer() As Byte, _ ByVal wBytes As Long) Kao Long

Međutim, žalba

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

neizbježno dovodi do fatalne programske pogreške.

Ovo je nastavak razgovora o osobitostima obrade varijabli niza u Visual Basicu: VB koristi dvobajtno Unicode kodiranje, Win API koristi jednobajtni ANSI (i s formatom usvojenim u C - s nultim bajtom na kraju) . Sukladno tome, kada se kao argument koriste string varijable, konverzija iz Unicode u ANSI uvijek se automatski izvodi prilikom pozivanja API funkcije (točnije, DLL funkcije) i obrnuta konverzija prilikom povratka.

Zaključak iz ovoga je jednostavan: String varijable se mogu koristiti za razmjenu znakovnih podataka, ali se ne mogu koristiti za razmjenu proizvoljnih binarnih informacija (kao što je bio slučaj sa 16-bitnim verzijama VB-a). U potonjem slučaju, bolje je koristiti jednodimenzionalni niz bajtova.

Kao što znate, tip String može se koristiti za opisivanje prilagođene strukture. U tom smislu morate zapamtiti sljedeće:

  • Strogo je zabranjeno koristiti sljedeću konstrukciju za pristup Win API-ju: Type MyStruct x As Single s As String 'string promjenjive duljine End Type

    U slučaju niza varijabilne duljine, deskriptor niza se prosljeđuje kao dio strukture sa svim posljedicama u vidu greške u izvršavanju programa.

  • Možete koristiti niz fiksne duljine kao strukturni element: Tip MyStruct x As Single s As String*8 ‘ niz fiksne duljine End Type

U tom slučaju izvodi se odgovarajuća pretvorba kodiranja.

I posljednja napomena: ni pod kojim okolnostima ne biste trebali koristiti niz varijabli niza (i fiksne i promjenjive duljine) kada pristupate API funkciji. Inače će biti zajamčena pojava "ilegalne operacije".

Vjerojatno ćete imati situaciju u kojoj trebate napisati vlastite DLL funkcije. Potreba za ovim će se neizbježno pojaviti ako koristite mješovitu tehnologiju programiranja - korištenje dva ili više programskih jezika za implementaciju jedne aplikacije.

S tim u vezi, napominjemo da je mješovito programiranje prilično uobičajeno za implementaciju prilično složene aplikacije. Doista, svaki jezik (točnije, programski sustav temeljen na jeziku) ima svoje prednosti i slabosti, pa je sasvim logično iskoristiti različite alate za rješavanje različitih problema. Na primjer, VB - za stvaranje korisničkog sučelja, C - za učinkovit pristup resursima sustava, Fortran - za implementaciju numeričkih algoritama.

Mišljenje autora je sljedeće: svako ozbiljno programiranje zahtijeva od programera poznavanje barem dva alata. Naravno, u suvremenim uvjetima jasne podjele rada vrlo je teško biti izvrstan stručnjak čak iu dva sustava, pa je logičnija shema "glavni i pomoćni jezici". Ideja je da čak i površno poznavanje "pomoćnog" jezika (pisanje prilično jednostavnih postupaka) može uvelike poboljšati učinkovitost korištenja "glavnog" jezika. Napominjemo da je poznavanje VB-a, barem kao pomoćnog, danas gotovo obavezan uvjet za profesionalnog programera. Usput, u doba DOS-a, poznavanje osnova Assemblera bilo je iznimno poželjno za svakog programera, uključujući Basic.

Na ovaj ili onaj način, čak iu grupnom radu, kada se svaki programer bavi svojim specifičnim zadatkom, svi sudionici projekta trebali bi imati ideju o značajkama proceduralnog sučelja na različitim jezicima. I znajte da mnogi programski sustavi (uključujući VB), osim zadanog sučelja, omogućuju korištenje drugih, naprednih metoda pristupa procedurama koje omogućuju prilagodbu sučelja drugom jeziku.

Kada proučavate interproceduralno sučelje, trebali biste obratiti pozornost na sljedeće moguće zamke:

  • Različiti jezici mogu koristiti različite konvencije za pisanje identifikatora. Na primjer, uobičajeno je koristiti podvlaku na početku naziva procedure, što nije dopušteno u VB. Ovaj se problem lako rješava korištenjem ključne riječi Alias ​​u izjavi Declare (pogledajte primjer savjeta 2.3).
  • Može se koristiti drugačiji slijed pisanja proslijeđenih argumenata na stog. Na primjer, u doba DOS-a (iskreno priznajem, ne znam kako to sada izgleda u Windows okruženju), C je pisao argumente s kraja liste, drugi jezici (Fortran, Pascal, Basic) - s početka.
  • Standardno se koriste različiti principi prosljeđivanja parametara - po referenci ili po vrijednosti.
  • Različiti principi pohranjivanja string varijabli. Na primjer, u C-u (kao iu Fortran-u i Pascalu), duljina niza određena je nultim bajtom na kraju, ali u Basicu je duljina eksplicitno zapisana u deskriptoru niza. Naravno, morate imati na umu mogućnost korištenja različitih kodiranja znakova.
  • Prilikom prijenosa višedimenzionalnih nizova, ne zaboravite da su moguće različite opcije za pretvaranje višedimenzionalnih struktura u jednodimenzionalne (počevši od prvog indeksa ili od posljednjeg, u odnosu na dvodimenzionalne nizove - "po redovima" ili "po stupcima" ).

Uzimajući sve ovo u obzir, mogu se formulirati sljedeće preporuke:

  • Koristite najjednostavnije, provjerene metode za prosljeđivanje argumenata DLL funkcijama. Standardi usvojeni za Win API sasvim su prikladni kao model.
  • Nikada ne prosljeđujte nizove string varijabli.
  • Budite vrlo oprezni kada prosljeđujete jednostavne string varijable i višedimenzionalne nizove.
  • Svakako posebno provjerite funkcionalnost mehanizma za prosljeđivanje argumenata pozvanoj proceduri i natrag. Napišite poseban test za provjeru prijenosa podataka. Zasebno provjerite je li svaki argument ispravno proslijeđen. Na primjer, ako imate proceduru s nekoliko argumenata, prvo provjerite je li svaki parametar ispravno proslijeđen za opciju s jednim argumentom, a tek onda za cijeli popis.

Ali što ako je DLL funkcija već napisana, na primjer, u Fortran-u, ali se njezino ulazno sučelje ne uklapa dobro u gore navedene VB standarde? Ovdje postoje dva savjeta. Prvo: napišite testnu DLL funkciju i upotrijebite je da pokušate pronaći željeni poziv iz VB programa koristeći pokušaj i pogrešku. Drugo: napišite proceduru adaptera u istom Fortranu koja bi omogućila jednostavno sučelje između VB i DLL funkcije s konverzijom jednostavnih struktura podataka u složene (na primjer, pretvorite višedimenzionalni niz bajtova u niz nizova).

Dakle: koristite DLL funkcije. Ali budite oprezni...

ComputerPress 9"2000

Izdali smo novu knjigu, Marketing sadržaja društvenih medija: Kako ući u glave svojih sljedbenika i navesti ih da se zaljube u vaš brend.

API je vanjsko sučelje za programiranje aplikacije, pristup stranicama pomoću određenog protokola za dobivanje informacija i pojednostavljeni razvoj programa povezanih s internim uslugama.

Što znači API?

Najjednostavnija analogija za korištenje API-ja bila bi uporaba kalkulatora za izvođenje složenih izračuna. Recimo da imate zadatak, možete razumjeti njegovu bit, izgraditi jednadžbe i grafikone, ali ne znate kako izvoditi aritmetičke operacije s brojevima. Pokraj vas je kalkulator koji s lakoćom može obaviti ove operacije. Ne znate što se događa unutar računala i ne morate znati. Informacije dajete u jednom obliku, a primate ih u drugom, potrebnom za vaše potrebe.

Svaki API radi na ovom principu. Nije vas briga kako program dobiva odgovor, kojim putem ide zahtjev unutar njega, kako se izvode izračuni. Sigurni ste samo u jedno - kao odgovor će biti dani standardizirani podaci o uspjehu operacije ili njezinoj pogrešci.

API sučelje omogućuje vam da ne gubite vrijeme, novac i trud na kupnju "novog bicikla". Dobivate radni informacijski port koji prima i šalje potrebne količine podataka za potrebe vašeg razvoja.

Prednosti:

  • Ušteda na razvoju vlastitog sučelja.
  • Nema potrebe razumjeti nijanse problema.
  • API-je razvijaju profesionalci i uzimaju u obzir sve čimbenike internih procesa kojih možda niste svjesni prilikom izrade svog rješenja.
  • Omogućuje vam komunikaciju sa servisima koji su zatvoreni putem drugih protokola.

minusi:

  • Ako se ciljna usluga ažurira, API ne dobiva uvijek odmah punu funkcionalnost.
  • Ne možete uhvatiti pogreške i ne znate kako proces funkcionira u tuđem kodu.
  • API ne daje uvijek najoptimiziranije rezultate u smislu vremena, jer je dizajniran za obradu općih slučajeva, a ne specifičnih.

API primjeri

API integracija je proces povezivanja aplikacije s vanjskim podatkovnim sučeljem. Rad s API-jem počinje proučavanjem dokumentacije i korištenih protokola, a zatim izravnom integracijom vašeg programa u sučelje. Pogledajmo najpopularnije usluge koje imaju vlastiti API.

VKAPI

Vanjsko sučelje za interakciju popularne društvene mreže VKontakte s klijentima, kao i s aplikacijama preglednika i poslužitelja. Omogućuje vam upravljanje porukama zajednice, naslovnicama grupa, korisničkim stranicama ako imate odgovarajuće pristupne ključeve.

Svi zahtjevi se šalju na adresu https://api.vk.com/method/

Nakon kose crte dolazi naziv korištene API metode i prenose se GET parametri zahtjeva. Odgovor također dolazi putem HTTPS-a u JSON formatu.

TELEGRAM BOT API

Jedan od najpopularnijih API-ja. Koristi se za kontrolu botova u Messengeru Telegram. Nakon što izradite bota putem @botfather i dobijete potrebne pristupne ključeve, možete započeti interakciju s pozadinom.

Zahtjevi se mogu uputiti na: https://api.telegram.org/bot0000000:token/

Gdje je bot0000000 zamijenjen jedinstvenim identifikatorom vašeg bota, a token izražava tajni ključ.

Zahtjevi se šalju putem HTTPS veze, naziv metode je označen kosom crtom na glavnoj adresi. Odgovor dolazi u JSON formatu.

OTVORI API VREMENSKE KARTE

Često je potrebno dobiti informacije o vremenu bez korištenja widgeta trećih strana i plaćenih aplikacija. Usluga OpenWeatherMap dolazi u pomoć s otvorenim i besplatnim API-jem. Nakon registracije i primanja identifikacijskih podataka, možete slati zahtjeve za vremenskom prognozom iz poslužiteljskih skripti diljem svijeta. Kao odgovor na ID grada, resurs vraća najdetaljnije informacije o trenutnom vremenu i daje prognozu za blisku budućnost.

Format: HTTP prijenos putem api.openweathermap.org/data/2.5/weather?id= koji označava identifikacijski broj željenog grada. Odgovor poslužitelja: JSON.

GOOGLE MAPS API

Što može biti ljepše od interaktivne karte svijeta na web stranici? Pogotovo ako ovo nije umetak predloška iz Google karata, već vaše osobno izdanje popularne karte s osobnim skupinama oznaka. Karta će komunicirati s drugim skriptama na web mjestu, šaljući informacije o klikovima i koordinatama.

Google Maps JavaScript API nudi slične mogućnosti. Modul je potpuno skriptiran i radi na strani preglednika, tako da nam ne trebaju HTTP zahtjevi iz PHP-a i formiranje zaglavlja na strani poslužitelja, kao što je to bio slučaj u drugim API-jima.

Na primjer, postavljanje markera na kartu izgledat će ovako:

var mark = new google.maps.Marker((
pozicija: myPOS,
karta: karta,
naslov: "Pozdrav!"
});

Koje su potrebe i prednosti korištenja API-ja?

Ima dosta korisnih funkcija.

Prvi aspekt

Možete uspostaviti interaktivnu interakciju korisnika s društvenim mrežama i instant messengerima, koristiti mogućnosti računalnih sustava trećih strana za prikaz tečajeva, vremena i drugih važnih informacija.

Korištenjem API-ja možete trenutno povezati druge resurse i softverska rješenja s poslužiteljima, za što bi obično bili potrebni tjedni razvoja. API pojednostavljuje život tamo gdje nije potrebna jedinstvena implementacija, a pouzdanost i sigurnost su prioritet.

Drugi aspekt

Ako ste vlasnik složene računalne snage, popularne usluge ili pohrane podataka za javni ili poluprivatni pristup, onda bi dobar potez bio podići vlastiti API. Što će dati:

  • Veliki protok klijenata.
  • Pojednostavljeni pristup vašim uslugama za partnere.
  • Pogodnost statističke analize korištenja usluge.

Treći aspekt

Skoro isto kao i drugi. Ali bez potrebe za implementacijom API-ja otvorenog pristupa. Ako imate portal i želite za njega izraditi mobilnu aplikaciju na Androidu/IOS-u, onda je ponovno pisanje sustava pod jednim API-jem najbolje rješenje. Cjelokupna struktura podataka je sistematizirana. Stranica i aplikacija radit će putem jednog podatkovnog kanala.

Ovaj kratki termin dobro je poznat svima koji imaju barem malo iskustva s razvojem. Ali ne razumiju svi što to točno znači i zašto je to potrebno. Developer Petar Gazarov govorio je o API-ju jednostavnim riječima na svom blogu.

Skraćenica API označava “Application Programming Interface” (aplikacijsko programsko sučelje, programsko sučelje aplikacije). Većina velikih tvrtki u nekoj fazi razvije API-je za klijente ili za internu upotrebu. Da biste razumjeli kako i kako se API-ji koriste u razvoju i poslovanju, prvo morate razumjeti kako funkcionira World Wide Web.

World Wide Web i udaljeni poslužitelji

WWW se može zamisliti kao velika mreža međusobno povezanih poslužitelja na kojima je pohranjena svaka stranica. Obično se prijenosno računalo može pretvoriti u poslužitelj koji može opsluživati ​​cijelu web stranicu na mreži, a programeri koriste lokalne poslužitelje za izradu web stranica prije nego što ih otvore širokom krugu korisnika.

Kada se unese u adresnu traku preglednika www.facebook.com Odgovarajući zahtjev šalje se udaljenom Facebook poslužitelju. Nakon što preglednik primi odgovor, interpretira kod i prikazuje stranicu.

Svaki put kada korisnik posjeti stranicu na Internetu, on komunicira s API-jem udaljenog poslužitelja. API je sastavni dio poslužitelja koji prima zahtjeve i šalje odgovore.

API kao način služenja klijentima

Mnoge tvrtke nude API-je kao gotove proizvode. Na primjer, Weather Underground prodaje pristup svom API-ju za vremenske podatke.

Scenarij upotrebe: Na web stranici male tvrtke nalazi se obrazac za zakazivanje termina za klijente. Tvrtka želi integrirati Google kalendar u njega kako bi korisnicima omogućila da automatski kreiraju događaj i unesu detalje o nadolazećem sastanku.

API aplikacija: Cilj je da poslužitelj stranice izravno kontaktira Google poslužitelj sa zahtjevom za kreiranje događaja s navedenim detaljima, primi Googleov odgovor, obradi ga i pošalje odgovarajuće informacije pregledniku, na primjer, poruku potvrde korisniku .

Alternativno, preglednik može uputiti zahtjev API-ju Googleovog poslužitelja bez prolaska kroz poslužitelj tvrtke.

Kako se Google Calendar API razlikuje od API-ja bilo kojeg drugog udaljenog poslužitelja na mreži?

Tehnički, razlika je u formatu zahtjeva i odgovora. Za generiranje cijele web-stranice, preglednik očekuje odgovor u HTML jeziku za označavanje, dok će Google Calendar API jednostavno vratiti podatke u formatu kao što je JSON.

Ako zahtjev API-ju uputi poslužitelj web stranice tvrtke, onda je to klijent (kao što je preglednik klijent kada korisnik otvori web stranicu).

Zahvaljujući API-ju, korisnik dobiva priliku izvršiti radnju bez napuštanja web stranice tvrtke.

Većina modernih web stranica koristi barem nekoliko API-ja trećih strana. Mnogi zadaci već imaju gotova rješenja koja nude programeri trećih strana, bilo da se radi o knjižnici ili usluzi. Često je lakše i pouzdanije posegnuti za gotovim rješenjem.

Mnogi programeri distribuiraju aplikaciju na nekoliko poslužitelja koji međusobno komuniciraju pomoću API-ja. Poslužitelji koji obavljaju funkciju podrške glavnom aplikacijskom poslužitelju nazivaju se mikroservisi.

Dakle, kada tvrtka nudi API svojim korisnicima, to jednostavno znači da je stvorila niz posebnih URL-ova koji vraćaju samo podatke kao odgovor.

Takvi se zahtjevi često mogu poslati putem preglednika. Budući da se HTTP prijenos podataka odvija u tekstualnom obliku, preglednik će uvijek moći prikazati odgovor. Na primjer, putem preglednika možete izravno pristupiti GitHub API-ju (https://api.github.com/users/petrgazarov), bez pristupnog tokena, i primiti ovaj odgovor u JSON formatu:

Preglednik savršeno prikazuje JSON odgovor, koji se može umetnuti u kod. Dovoljno je jednostavno izvući podatke iz takvog teksta da biste ga mogli koristiti po vlastitom nahođenju.

Još nekoliko API primjera

Riječ "primjena" može imati različita značenja. U kontekstu API-ja to znači:

  • dio softvera s određenom funkcijom,
  • cijeli poslužitelj, cijela aplikacija ili samo zasebni dio aplikacije.

Svaki dio softvera koji se može jasno razlikovati od okoline može zamijeniti slovo “A” u engleskoj kratici, a može imati i neku vrstu API-ja. Na primjer, kada programer implementira biblioteku treće strane u kod, ona postaje dio cijele aplikacije. Kao samostalni dio softvera, knjižnica će imati neku vrstu API-ja koji joj omogućuje interakciju s ostatkom koda aplikacije.

U objektno orijentiranom dizajnu, kod je predstavljen kao zbirka objekata. U aplikaciji može postojati stotine takvih objekata koji međusobno djeluju. Svaki od njih ima svoj API - set javnost svojstva i metode za interakciju s drugim objektima u aplikaciji. Objekti također mogu imati privatna, interna logika koja je skrivena od okoline i nije API.

Najbolji članci na temu