Kako podesiti pametne telefone i računare. Informativni portal

API funkcije jezika Visual Basic. Programski interfejs aplikacije Api podaci šta

Kako bi olakšali rad svojim kolegama i omogućili svim Windows programima univerzalno sučelje, Microsoft programeri su kreirali nešto poput API-ja – „Aplikacijski programski interfejs“.

Ovo je skup funkcija i procedura koje programi najčešće mogu koristiti: prikazivanje stabla direktorija, traženje datoteka, prikazivanje standardnog prozora sa dugmadima za zatvaranje, minimiziranje i maksimiziranje i mnogi drugi. Kao rezultat toga, programer koji kreira program za Windows ne mora razmišljati i razvijati posebne potprograme za prikaz prozora programa, prozora za odabir mape i drugih sličnih elementarnih operacija - može jednostavno pozvati kernel32.dll ili user32.dll iz biblioteka koje sadrže funkcije i procedure API, funkciju koja mu je potrebna, a ona će sve učiniti za njega sama. Postoji mnogo takvih funkcija i procedura - oko 600.

U operativnom sistemu MS-DOS nije postojao API - onaj koji je preuzeo da napiše program za ovaj operativni sistem bio je dužan da razmisli i primeni metode za prikazivanje slika na ekranu, primanje podataka od korisnika, od početak do kraja.putovanje kroz sistem datoteka, crtanje grafike, ako je takva mogućnost bila neophodna 2. To je proces razvoja programa sa korisničkim sučeljem činilo vrlo napornim procesom; često su vrijeme i trud utrošeni na kreiranje prihvatljivog grafičkog sučelja za program premašivali troškove implementacije vlastitog algoritma programa, za koji je i kreiran. . Nije uzalud da su takozvane „konzolne“ aplikacije bile vrlo česte, odnosno programi koji su radili samo iz komandne linije, bez sučelja - podaci su uneseni na istoj komandnoj liniji ili napravljeni iz datoteke navedene u njoj, a rezultati su objavljeni u jednostavnom tekstualnom modu.

Pojavom operativnog sistema Windows, naporan rad programera na razvoju izgleda programa i praktičnih metoda za unos i izlaz informacija uvelike je olakšan - API funkcije su se već koristile u Windows 3.0. Sada, programer, ako je, na primjer, želio da kreira prozor za unos teksta ili traku za pomicanje, morao je samo da napiše poziv funkciji za prikaz takvog prozora sa parametrima koji su mu potrebni, kao i svaka druga funkcija jezik na kojem je napisao svoj program, a ne da uvodi ogromne količine koda za kreiranje programa koji ponovo iscrtava takav prozor ili traku (i da je svjestan da će pri razvoju sljedećeg programa koji također koristi takve objekte morati razviti ponovo takav kod ili pokušajte djelimično koristiti stari, prilagođavajući ga potrebama ovog novog programa). Stoga je pojava API-ja napravila revolucionarni proboj u tehnologiji programiranja, omogućavajući vam da kreirate potrebne programe sa poznatim, praktičnim sučeljem mnogo brže, bez brige o takvim rutinskim detaljima kao što je programiranje standardnih objekata interfejsa za unos i izlaz informacija.

U jeziku Visual Basic for Applications (VBA), mnoge funkcije i API procedure se same pozivaju kada interpretator izvrši program, tako da nema potrebe da ih koristite za prikaz prozora za unos i izlaz teksta, crtanje geometrijskih oblika na ekran i druge jednostavne radnje - VBA ih poziva po potrebi, a program na njemu samo treba da koristi 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 primer, prozor za izbor fascikle sa slikom stabla direktorijuma (slika 5.1) ili program za pretragu datoteka (analogno u VBA funkcijama - objekat "Application.FileSearch" - radi presporo sa velikim brojem datoteka). Za takve slučajeve, VBA pruža mogućnost pozivanja API funkcija.

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

U velikoj većini slučajeva, kada programirate za Office, možete bez upotrebe API-ja, ali ponekad samo pozivanje API funkcije može postići željeni rezultat. Recimo da morate osigurati da se različiti makroi pozivaju kada jednostavno kliknete na dugme na traci sa Word alatima mišem i kada istovremeno pritisnete ovo dugme i taster Shift ili Control. Evo isječka koda koji ovo radi:

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

GetAsyncKeyState(vbKeyShift ili vbKeyControl)

Ako GetAsyncKeyState(vbKeyShift) Onda

Poziv makro1: Izlaz iz pod

ElseIf GetAsyncKeyState(vbKeyControl) Onda

Poziv makro2: Izlaz iz pod

Prvi red je poput „rezerviranja“ API funkcije za upotrebu u VBA programu. Vidi se da se funkcija GetAsyncKeyState poziva iz biblioteke (datoteka koja sadrži programe namijenjene samo drugim programima) user32.dll, te se ovoj funkciji prosljeđuje broj ključa i vraća cijeli broj (naime 0, ako taster sa odgovarajućim brojem nije pritisnut, a -32767 ili 1 ako se pritisne). Svaka funkcija ili procedura pozvana iz biblioteka koje nisu VBA mora biti rezervirana korištenjem naredbe Declare.

Fraza vbKeyShift u naredbi je zamjena za šifru tipke Shift (njena vrijednost je 16), a vbKeyControl, kao što je lako razumjeti, je zamjena za kod tipke Control. Čini se da je struktura naredbi "If...Then" jasna 3, ali ako nije, pogledajte VBA pomoć. Komanda Call ispred imena makroa, kao što se sećate, znači njegovo pokretanje.

Na internetu postoje ruske stranice posvećene API 4. Posjetite ih da saznate više o ovom skupu funkcija.

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

Ali pošto veći dio Wikipedije nije razumljiv mnogim ljudima, pokušat ću laički objasniti šta je API i za šta su obično napravljeni i kako se koriste.

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 partnerski program. Affiliate program radi na sljedećem principu: osoba se registruje u affiliate programu i dobija motor trgovine. Tada može instalirati ovu trgovinu na svoj hosting i početi raditi. Ali svi podaci o ovoj prodavnici preuzeti su iz naše baze podataka, odnosno svakom partneru trebamo dati pristup našoj dragocjenoj bazi podataka. Možete li zamisliti koliko je ovo opasno? Na kraju krajeva, moramo otvoriti pristup bazi podataka izvana kako bi sve partnerske trgovine mogle raditi s njom. Šta se dešava ako vaši pristupni podaci padnu u ruke kriminalaca?

Ovdje će nam pomoći API. Umjesto davanja pristupa bazi podataka, jednostavno ćemo napraviti API preko kojeg će partnerske trgovine primati informacije. Na ovaj način, samo naša API skripta će raditi sa bazom podataka, a prodavnice će raditi sa 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 listu knjiga koja se sastoji od 20 primjeraka, jer smo prenijeli limit parametar jednak 20. Naša skripta (API) postavlja zahtjev bazi podataka, prima listu knjiga i vraća ih na pohraniti (u stvari, 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, serijalizirani niz ili XML. Ovo više nije važno, najvažnije je da razumijete princip.

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

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

Windows API - skup funkcija operativnog sistema

Skraćenica API mnogim programerima početnicima izgleda vrlo misteriozno, pa čak i zastrašujuće. U stvari, sučelje za programiranje aplikacije (API) je samo neki gotov skup funkcija koje programeri aplikacija mogu koristiti. Generalno, ovaj koncept je ekvivalentan onome što se ranije češće zvalo biblioteka potprograma. Međutim, API se obično odnosi na posebnu kategoriju takvih biblioteka.

Tokom 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 ove funkcije mogu efikasno koristiti za kreiranje drugih aplikacija, uključujući i druge programere. U tom slučaju, autori se, na osnovu strategije promocije svog proizvoda, moraju odlučiti na pitanje: otvaraju li pristup ovom setu vanjskim korisnicima ili ne? Ako je odgovor da, fraza “Paket uključuje otvoreni skup API funkcija” pojavljuje se u opisu softverskog paketa kao pozitivna karakteristika (ali ponekad za dodatni novac).

Stoga se najčešće API odnosi na skup funkcija koje su dio jedne aplikacije, ali su također dostupne za korištenje u drugim programima. Na primjer, Excel, pored svog krajnjeg korisničkog sučelja, ima skup Excel API funkcija koje se mogu koristiti, posebno, prilikom kreiranja aplikacija pomoću VB.

U skladu s tim, Windows API je skup funkcija koje su dio samog operativnog sistema i istovremeno dostupne bilo kojoj drugoj aplikaciji, uključujući i one napisane pomoću VB-a. U tom smislu je sasvim opravdana analogija sa BIOS/DOS sistemom prekida, koji je zapravo DOS API.

Razlika je u tome što je opseg Windows API funkcija, s jedne strane, mnogo širi u odnosu na DOS, as druge strane ne uključuje mnoge alate za direktno upravljanje računarskim resursima koji su bili dostupni programerima u prethodnim OS. Osim toga, pozivi Windows API-ju se izvode korištenjem običnih proceduralnih poziva, a pozivi DOS funkcijama se izvode putem posebne procesorske instrukcije koja se zove Interrupt.

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

Uprkos činjenici da VB ima veliki izbor funkcija, u procesu manje ili više ozbiljnog razvoja otkriva se da njihove mogućnosti često nisu dovoljne za rješavanje potrebnih problema. Istovremeno, programeri početnici često počinju da se žale na nedostatke VB-a i razmišljaju o promeni alata, ne sluteći da njihov računar ima ogroman skup alata i da samo treba da znaju kako da ih koriste.

Prilikom upoznavanja sa Win API-jem, otkriva se da mnoge ugrađene VB funkcije nisu ništa drugo do pozivi odgovarajućim sistemskim procedurama, već samo implementirane u obliku sintakse datog 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 preći na korištenje API-ja, jer to ponekad može značajno poboljšati performanse (posebno zbog odsustva 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, API funkcija CreateDirectory 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 direktorij pomoću 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 brojnih jezičnih ograničenja, na primjer, zbog nemogućnosti rada sa memorijskim adresama. Ali u nekim slučajevima, netrivijalne tehnike programiranja mogu pomoći (posebno u slučaju istih adresa).

Autorovo lično gledište je sljedeće - umjesto proširenja ugrađenih funkcija VB-a iz verzije u verziju, trebalo bi mu dati dobar opis najpopularnijih API funkcija. U isto vrijeme, želio bih savjetovati programere da ne čekaju da se pojavi nova verzija alata s proširenim funkcijama, već da pobliže pogledaju sastav postojećeg Win API-ja - vjerovatno je da su vam mogućnosti potrebne mogao biti implementiran već u verziji VB 1.0, objavljenoj 1991. godine.

Kako naučiti Win API

Ovo nije tako jednostavno pitanje, s obzirom da se broj Win32 API funkcija procjenjuje na oko 10 hiljada (niko ne zna tačan broj, čak ni Microsoft).

VB (verzije 4-6) uključuje datoteku koja opisuje Win API deklaracije - WIN32API.TXT (kasnije ćemo vam reći više o njegovoj upotrebi). Ali, prvo, uz njegovu pomoć možete dobiti informacije o svrsi određene funkcije i njenim 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 sa praktičnim interfejsom su nestale.

Sveobuhvatne informacije o Win32 API-ju se mogu naći u pomoći za paket za razvoj softvera platforme, koji je uključen u CD-ove MSDN biblioteke 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 spominjemo da su svi opisi tamo dati u vezi sa C jezikom.

Knjige poznatog američkog stručnjaka Daniela Applemana općenito su u svijetu priznate po učenju API programiranja u VB okruženju. Njegov Visual Basic Programer's Guide to the Windows API serijal (za Win16, Win32 i razne verzije VB-a) je jedna 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. godine, autoru je iz SAD donio prijatelj koji ju je pronašao u prvoj knjižari jednog malog provincijskog grada.

Ova knjiga ima preko 1500 stranica, pokriva opšte tehnike API programiranja 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 štampanu verziju. Godine 1999. Dan Appleman je objavio novu knjigu, Win32 API Puzzle Book and Tutorial for Visual Basic programere Dana Applemana, koja uključuje informacije o još 7.600 funkcija (iako ne tako opsežne).

Win API i biblioteka dinamičkih veza (DLL)

Win API set je implementiran u obliku dinamičkih DLL-ova. Zatim ćemo zapravo govoriti o tehnologiji korištenja DLL-ova u VB okruženju koristeći primjer biblioteka uključenih u Win API. Međutim, kada govorimo o DLL-ovima, treba napomenuti nekoliko važnih stvari.

U ovom slučaju, pod DLL-om podrazumijevamo tradicionalnu verziju binarnih dinamičkih biblioteka, koje aplikacijama obezbjeđuju direktan pristup potrebnim procedurama - potprogramima ili funkcijama (prilično na isti način kao što se dešava kada se pozivaju procedure unutar VB projekta). Takve biblioteke se mogu kreirati pomoću različitih alata: VC++, Delphi, Fortran, osim VB (da vidimo šta se pojavljuje u verziji 7.0) - potonji može kreirati samo ActiveX DLL-ove, kojima se pristupa preko OLE Automation interfejsa.

Tipično datoteke dinamičke biblioteke imaju ekstenziju .DLL, ali to uopšte nije neophodno (za Win16 se često koristila ekstenzija .EXE); drajveri spoljnih uređaja su označeni pomoću .DRV.

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

A sada nekoliko savjeta.

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

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

Pozovi DllName([lista 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:

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

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

Ovdje su opcijski elementi operatora prikazani u uglastim zagradama, izrazi varijabli su kurzivom, a preostale riječi su ključne riječi. Sistem pomoći daje prilično dobar opis sintakse operatora, tako da ćemo za sada napomenuti samo nekoliko tačaka.

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

Win32 API set je implementiran samo u obliku funkcija (Win16 API je imao mnogo podrutina). Uglavnom, to su funkcije tipa Long, koje najčešće vraćaju kod završetka operacije.

Operator Declare pojavio se u MS Basic-u još u doba DOS-a, a koristio se i za deklarisanje internih projektnih procedura. U Visual Basicu to nije potrebno, pošto je deklaracija internih procedura automatski njihova deklaracija pod ili funkcija. U poređenju sa Basic/DOS-om, novi opis mora naznačiti ime datoteke biblioteke u kojoj se nalazi tražena procedura. Wip API biblioteke nalaze se u Windows sistemskom direktoriju, tako da je dovoljno navesti samo naziv datoteke. Ako pristupate DLL-u koji se nalazi na slučajnoj lokaciji, morate zapisati punu putanju do ove datoteke.

Opis izjave Declare obično zauzima dosta prostora i ne stane u jedan red u prozoru koda. Stoga preporučujemo da se pridržavate određene šeme preloma linija prilikom pisanja aplikacija, na primjer:

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

U ovom slučaju, svi glavni elementi opisa postavljeni su na različite linije i stoga su laki za čitanje.

Savjet 2: Budite posebno oprezni kada radite s DLL funkcijama

Upotreba 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 je rizik smanjenja pouzdanosti aplikacije, posebno tokom njenog otklanjanja grešaka.

Jedna od najvažnijih prednosti VB okruženja je pouzdanost procesa razvoja programa: radeći pod kontrolom interpretatora, programski kod teoretski ne može poremetiti rad Windowsa i samog VB-a. Programer možda neće biti previše pažljiv u pogledu ispravnosti prosljeđivanja parametara pozvanim funkcijama - takve greške će sam interpretator lako otkriti bilo tokom procesa prevođenja koda ili tokom njegovog izvršavanja. U najneugodnijem slučaju, način obrade će jednostavno biti prekinut, uz naznaku gdje i zašto je došlo do greške.

Korišćenje Windows API funkcija ili drugih DLL-ova direktno uklanja takvu kontrolu nad prenosom podataka i procesom izvršavanja koda izvan VB okruženja. Stoga, greška u pristupu vanjskim funkcijama može dovesti do neoperabilnosti i VB-a i operativnog sistema. Ovo je posebno istinito u fazi razvoja programa, kada je prisustvo grešaka sasvim prirodno. Dakle, korištenjem širih mogućnosti funkcija osnovnog sloja sistema, programer preuzima odgovornost za njihovu ispravnu upotrebu.

Problem je dodatno otežan činjenicom da različiti programski jezici koriste različite načine prosljeđivanja parametara između procedura. (Preciznije, različite metode prosleđivanja se koriste podrazumevano, pošto mnogi jezici mogu da podržavaju više metoda.) Win API-ji su implementirani u C/C++ i koriste konvencije o prenošenju parametara C/C++ koje se razlikuju od uobičajene VB verzije.

S tim u vezi, treba napomenuti da je pojava analoga API funkcija ugrađenih u VB opravdana upravo prilagođavanjem potonjeg VB sintaksi i implementacijom odgovarajućeg mehanizma kontrole razmjene podataka. Napomenimo i to da je u fazi eksperimentalnog otklanjanja grešaka u aplikaciji prilikom kreiranja izvršnog modula bolje koristiti opciju kompilacije P-koda umjesto Native Code (mašinskog koda). U prvom slučaju, program će raditi pod kontrolom interpretatora - sporije u odnosu na mašinski kod, ali pouzdanije sa stanovišta mogućeg pogrešnog uticaja na operativni sistem i pružanje pogodnijeg načina za identifikaciju mogućih grešaka.

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

Korišćenje API funkcije zahteva pažljivije programiranje korišćenjem nekih manje poznatih tehnika poziva procedura (u poređenju sa VB). Nastavićemo da se bavimo ovim problemima u nastavku. A sada predstavljamo sažetak savjeta koje je formulirao Dan Appleman na ovu temu (njihova prva verzija pojavila se još 1993. godine) s nekim našim dodacima i komentarima.

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

Ovi primjeri pokazuju utjecaj ByVal operatora na prosljeđivanje parametara

Vrsta parametra Sa ByVal-om Bez ByVala
Integer 16-bitni cijeli broj se gura na stek 32-bitna adresa 16-bitnog cijelog broja se gura u stog
Dugo 32-bitni cijeli broj se gura u stog 32-bitna adresa 32-bitnog cijelog broja se gura u stog
String Niz se konvertuje u format koji se koristi u C (podaci i završni nul bajt). 32-bitna adresa novog reda se gura u stog VB ručka niza se gura na stek. (Takve ručke nikada ne koristi sam Windows API i prepoznaju se samo u DLL-ovima implementiranim posebno za VB.)

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

Da biste to razumjeli, provedite eksperiment koristeći sljedeće programe:

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

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

Sub MyProc (ByVal v As Integer)

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

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

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

U klasičnom slučaju (C, Fortran, Pascal), razlika između režima ByRef i ByVal zavisi od toga šta je tačno postavljeno na stog za razmenu podataka - adresa varijable ili njena vrednost. Basic istorijski koristi varijantu ByVal softverske emulacije - uvek postoji adresa na steku, ali samo kada se prosledi po vrednosti za to se kreira privremena varijabla. Za razliku između ove dvije opcije (Classic i Basic), koriste se različiti načini opisivanja ByVal moda. Imajte na umu da emulacija ByVal režima u VB-u obezbeđuje veću pouzdanost programa: mešanjem oblika reference, programer rizikuje samo da će ispravljena vrednost varijable biti vraćena (ili ne vraćena) pozivnom programu. U „klasičnoj“ verziji, takva zabuna može dovesti do fatalne greške prilikom izvršavanja procedure (na primjer, kada se umjesto memorijske adrese koristi vrijednost varijable jednaka, recimo, nuli).

DLL funkcije se implementiraju prema „klasičnim“ principima i stoga zahtijevaju obavezan opis načina na koji se podaci razmjenjuju sa svakim od argumenata. Deklaracije funkcije kroz opis Declare (tačnije, lista prosleđenih argumenata) služe ovoj svrsi. Najčešći način prosljeđivanja parametara funkciji Windows API-ja ili DLL-u je korištenje ključne riječi ByVal. Štaviše, može se specificirati i u operatoru Declare i direktno prilikom pozivanja funkcije.

Posljedice pogrešnog prenošenja parametara je lako predvidjeti. Ako primite očigledno 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, jezgro Windowsa) sa svim katastrofalnim posljedicama koje slijede.

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

3. Provjerite vrstu povrata.

VB je prilično tolerantan na nepodudarnosti tipova povratka funkcije, budući da se numeričke vrijednosti obično vraćaju kroz registre, a ne kroz stog. Sljedeća pravila će pomoći u određivanju ispravne vrijednosti 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 kao pod ili kao funkcija koja vraća vrijednost odgovarajućeg tipa.
  • Nijedna od API funkcija ne vraća brojeve s pomičnim zarezom, ali neki DLL-ovi mogu vratiti ovu vrstu podataka.

4. Koristite konstrukciju „Kao bilo koji“ sa velikom pažnjom. Mnoge funkcije Windows API-ja imaju mogućnost da prihvate parametre različitih tipova i koriste konstrukciju As Any da to urade (tumačenje tipa se izvodi ovisno o vrijednosti drugih proslijeđenih parametara).

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

5. Ne zaboravite inicijalizirati stringove. Postoje mnoge funkcije u Win API-ju koje vraćaju informacije učitavanjem podataka u string bafere proslijeđene kao parametar. U svom programu naizgled možete sve raditi ispravno: ne zaboravite na ByVal, ispravno proslijedite parametre funkciji. Ali Windows ne može provjeriti kolika je veličina memorije dodijeljene za red. Veličina reda mora biti dovoljno velika da primi sve podatke koji se u njega mogu smjestiti. Odgovornost za rezervisanje bafera potrebne veličine leži na VB programatoru.

Treba napomenuti da se u 32-bitnom Windowsu, kada se koriste nizovi, konverzija se vrši iz Unicode-a (dvobajtno kodiranje) u ANSI (jednobajtno kodiranje) i nazad, uzimajući u obzir postavke nacionalnog sistema. Stoga je za rezervisanje bafera ponekad zgodnije koristiti nizove bajtova umjesto varijabli niza. (Više o tome u nastavku.)

Najčešće, Win API funkcije vam omogućavaju da sami definirate maksimalnu veličinu bloka. Konkretno, ponekad ovo zahtijeva pozivanje druge API funkcije koja će "kazati" veličinu bloka. Na primjer, GetWindowTextLength vam omogućava da odredite dužinu niza potrebne za držanje naslova prozora koji vraća funkcija GetWindowText. U ovom slučaju, Windows osigurava da ne pretjerate.

6. Obavezno koristite opciju Explicit.

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

Windows 9x je poboljšao provjeru parametara za većinu API funkcija. Stoga prisustvo greške u podacima obično ne uzrokuje fatalnu grešku, ali nije tako lako utvrditi šta je uzrokovalo.

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

  • Koristite način otklanjanja grešaka korak po korak 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 otklanjanje grešaka kao što je CodeView i verziju Windowsa za otklanjanje grešaka (dostupnu u Windows SDK). Ovi alati mogu otkriti grešku u parametrima i barem odrediti koja API funkcija uzrokuje grešku;
  • Koristite dodatne alate treće strane da provjerite tipove parametara i valjanost njihovih vrijednosti. Takvi alati ne samo da mogu pronaći greške u parametrima, već čak i ukazati na red VB koda gdje se greška dogodila.

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

8. Zapamtite da cijeli brojevi u VB-u i u Windows-u nisu ista stvar. Prije svega, treba imati na umu da izraz “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 potpisane količine (odnosno, jedna cifra se koristi kao znak, ostatak kao mantisa broja), u Windows-u 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 ovo. Razgovaraćemo o tome šta učiniti u ovom slučaju odvojeno.

9. Obratite posebnu pažnju na nazive funkcija. Za razliku od Win16, imena svih Win32 API funkcija su osjetljiva na tačnu upotrebu malih i velikih slova (to nije bio slučaj u Win16). Ako negdje koristite malo slovo umjesto velikog ili obrnuto, ž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 ovome pogledajte u nastavku.)

10. Često čuvajte svoj rad. Greške povezane sa nepravilnim korišćenjem DLL-ova i Win API-ja mogu dovesti do hitnog ukidanja VB okruženja, a možda i celog operativnog sistema. Trebali biste osigurati da je kod koji napišete sačuvan prije probnog pokretanja. Najjednostavnije je podesiti mod za automatsko snimanje projektnih modula prije pokretanja projekta u VB okruženju.

Nakon što pročitate prethodni savjet, možda mislite da je korištenje Win API funkcija rizično. To je donekle tačno, ali samo u poređenju sa sigurnim programiranjem koje obezbeđuje sam VB. Ali uz vješto korištenje 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, ranije smo spomenuli zamke za široku klasu DLL-ova. U slučaju Win API-ja, sve je mnogo jednostavnije, jer je oblik za pristup ovim funkcijama jasno objedinjen. Treba imati na umu sljedeće glavne tačke:

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

    Deklarirajte naziv funkcije& ‘ tip funkcije _ određuje se pomoću sufiksa

    Poziv API funkcije izgleda ovako:

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

    PAŽNJA! Kada radite u VB-u, bolje je koristiti LastDLLERror svojstvo Err objekta da biste dobili vrijednost kvalifikovanog koda greške, budući da VB ponekad resetuje funkciju GetLastError između poziva API-ja i nastavka izvršavanja programa.

    Možete protumačiti kod koji vraća GelLastError koristeći konstante napisane u datoteci API32.TXT, s imenima koja počinju sufiksom ERROR_.

    Najtipičnije greške imaju sljedeće kodove:

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

    Međutim, mnoge funkcije vraćaju vrijednost nekog traženog parametra (na primjer, OpenFile vraća vrijednost ručke datoteke). U takvim slučajevima, greška je određena nekom drugom posebnom vrijednosti Return&, najčešće 0 ili –1.

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

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

    B) ByVal...Kao string

    Ova vrsta prenosa podataka se takođe dešava prilično često, a takođe i sa argumentom Uvijek ByVal se primjenjuje. Kada se pozove API funkcija, adresa stringa 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 string vrši u pozivajućem programu, pa ako će API funkcija ispuniti nizove, onda morate kreirati niz potrebne veličine prije nego što ga pozovete. Na primjer, funkcija GetWindowsDirectory vraća putanju do Windows direktorija, koji po definiciji ne smije biti duži od 144 znaka. U skladu s tim, pozivanje ove funkcije bi trebalo izgledati otprilike ovako:

    WinPath$ = Space$(144) ' rezervišite niz od _ 144 karaktera Result& = GetWindowsDirectory& (WinTath$, 144) _ ' popunite bafer ' Result& - stvarni broj znakova u nazivu direktorija _ WinPath$ = Left$(WinPath , Rezultat&)

    Drugi problem je u tome što se prilikom pozivanja API funkcije izvorni niz konvertuje u neki interni prikaz, a pri izlasku iz funkcije, obrnuto. Ako se u danima Win16 ova operacija sastojala samo od dodavanja nula bajta na kraju linije, onda je s pojavom Win32 to dodano transformaciji dvobajtnog Unicode kodiranja u ANSI i obrnuto. (O tome je detaljno razmotreno u članku “Osobine rada sa string varijablama u VB”, ComputerPress 10’99 i 01’2000). Za sada, napominjemo da koristeći ByVal ... kao String konstrukciju, možete razmjenjivati ​​nizove samo sa podacima znakova.

    B) ...Kao bilo koji

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

    D) ... Kao UserDefinedType

    Ovaj dizajn se takođe često koristi kada je potrebno razmeniti podatke (uglavnom u oba smera) koristeći neku strukturu. Zapravo, ova konstrukcija je svojevrsna konkretna implementacija 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 odgovornost je programera da je pravilno opiše i rezerviše u programu koji poziva. Ovaj dizajn Uvijek korišteno bez riječi ByVal, odnosno u ovom slučaju se vrši prijenos po referenci - adresa varijable se upisuje u stek.

Primjer pozivanja API funkcije

Ilustrirajmo gore navedeno na primjeru korištenja dvije korisne funkcije 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) As Long Deklarirajte funkciju lread Lib “kernel32” _ Alias ​​“_lread” (_ ByVal hFile As Long, lpBuffer As Any, _ ByVal wBytes As Long) Dokle god

U VB-u, njihovi analozi - u ovom slučaju tačni - su Open i Get operatori (za binarni način rada). Odmah obratimo pažnju na upotrebu ključne riječi Alias ​​u deklaraciji funkcije - to je upravo slučaj kada ne možete bez nje. Stvarna imena funkcija u biblioteci počinju donjom crtom (tipičan stil jezika C), što nije dozvoljeno u VB.

Operacija otvaranja datoteke može izgledati ovako:

Const INVALID_HANDLE_VALUE = -1 ' neispravna _ vrijednost deskriptora lpFileName$ = “D:\calc.bas” ' naziv datoteke wReadWrite& = 2 ' način čitanja-pisanja hFile& = lopen(lpFileName$, wReadWrite&) _ descript ' ili ako definirajte h File INVALID_HANDLE_VALUE Zatim _ ' greška pri otvaranju datoteke ' navedite kod greške CodeError& = Err.LastDllError 'CodeError& = GetLastError _ ' ova konstrukcija ne radi. Kraj ako

Ovdje morate obratiti pažnju na dvije tačke:

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

Sadržaj datoteke se tada može pročitati, ali to pretpostavlja da programer mora imati neko razumijevanje njene strukture (baš kao što je slučaj kada se radi sa 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 stvarnog broja, 4 bajta ' wBytes je broj podataka koji su stvarno pročitani, ' -1 je greš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

Imajte na umu ponovo: drugi argument funkciji se prosljeđuje po referenci, a ostali se prosljeđuju po vrijednosti.

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

Ovdje možete vidjeti važnu razliku u odnosu na prethodni primjer - varijablu stringa obavezno prati ključna riječ ByVal.

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

Dim MyArray(1 do 10) kao bajt wBytes = lread (hFile&, MyArray(1), _ Len(MyArray(1))* 10) ‘ pročitaj 10 elemenata niza

Navođenjem prvog elementa niza kao argumenta, prosljeđujemo adresu početka memorijskog područja rezerviranog za niz. Očigledno, 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 pseudonim za Gears i parametri As Any

Ovdje ćemo, na osnovu prethodnog primjera, otkriti suštinu četvrtog savjeta Dana Applemana.

Kada radite sa funkcijom lread, treba da zapamtite da kada joj pristupate pomoću varijable string, morate koristiti ključnu riječ ByVal (u suprotnom ćete primati poruke o nezakonitoj operaciji). Da biste se zaštitili, možete napraviti dodatni poseban opis iste funkcije da radi samo sa string varijablama:

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

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

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

Čini se da vam sintaksa operatora Declare omogućava da napravite sličan poseban opis za niz:

Deklarirajte funkciju lreadString Lib “kernel32” Alias ​​“_lread” (_ ByVal hFile As Long, lpBuffer() kao bajt, _ ByVal wBytes koliko dugo)

Međutim, žalba

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

neizbježno dovodi do fatalne programske greške.

Ovo je nastavak razgovora o posebnostima obrade string varijabli u Visual Basicu: VB koristi dvobajtno Unicode kodiranje, Win API koristi jednobajtni ANSI (i sa formatom usvojenim u C - sa nultim bajtom na kraju) . U skladu s tim, kada se varijable stringova koriste kao argument, konverzija iz Unicodea u ANSI se uvijek automatski izvodi pri pozivanju API funkcije (tačnije, DLL funkcije) i obrnuta konverzija pri vraćanju.

Izvod 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 se može koristiti za opisivanje prilagođene strukture. S tim u vezi, morate zapamtiti sljedeće:

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

    U slučaju stringa promenljive dužine, deskriptor stringa se prosleđuje kao deo strukture sa svim posledicama koje proizilaze u obliku greške u izvršavanju programa.

  • Možete koristiti string fiksne dužine kao element strukture: Upišite MyStruct x As Single s Kao String*8 ‘ String fiksne dužine End Type

U ovom slučaju se izvodi odgovarajuća konverzija kodiranja.

I poslednja napomena: ni pod kojim okolnostima ne biste trebali koristiti niz varijabli niza (i fiksne i promjenjive dužine) kada pristupate API funkciji. U suprotnom će biti zagarantovana pojava „ilegalne operacije“.

Vjerovatno ćete imati situaciju u kojoj ćete morati pisati vlastite DLL funkcije. Potreba za tim će se neizbježno pojaviti ako koristite tehnologiju miješanog programiranja - korištenjem 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. Zaista, svaki jezik (tačnije, programski sistem zasnovan na jeziku) ima svoje prednosti i slabosti, pa je sasvim logično iskoristiti prednosti različitih alata za rešavanje različitih problema. Na primjer, VB - za kreiranje korisničkog interfejsa, C - za efikasan pristup sistemskim resursima, Fortran - za implementaciju numeričkih algoritama.

Autorovo mišljenje je sledeće: svako ozbiljno programiranje zahteva od programera da bude vešt u bar dva alata. Naravno, u savremenim uslovima jasne podjele rada vrlo je teško biti odličan stručnjak čak i u dva sistema, pa je shema „glavnog i pomoćnog jezika“ logičnija. Ideja je da čak i površno poznavanje “pomoćnog” jezika (pisanje prilično jednostavnih procedura) može uvelike poboljšati efikasnost upotrebe “glavnog”. Imajte na umu da je poznavanje VB-a, barem kao pomoćnog, danas gotovo obavezan uslov za profesionalnog programera. Inače, u doba DOS-a, poznavanje osnova Assemblera bilo je izuzetno poželjno za svakog programera, uključujući i Basic.

Na ovaj ili onaj način, čak i u grupnom radu, kada se svaki programer bavi svojim specifičnim zadatkom, svi učesnici projekta trebali bi imati predstavu o karakteristikama proceduralnog sučelja na različitim jezicima. I znajte da vam mnogi programski sistemi (uključujući VB), pored podrazumevanog interfejsa, omogućavaju korišćenje drugih, naprednih metoda pristupa procedurama koje omogućavaju prilagođavanje interfejsa drugom jeziku.

Kada proučavate međuproceduralni interfejs, obratite pažnju na sledeće moguće zamke:

  • Različiti jezici mogu koristiti različite konvencije za pisanje identifikatora. Na primjer, uobičajeno je koristiti donju crtu na početku naziva procedure, što nije dozvoljeno u VB-u. Ovaj problem se lako rješava korištenjem ključne riječi Alias ​​u izjavi Declare (pogledajte primjer savjeta 2.3).
  • Može se koristiti drugačiji redoslijed pisanja proslijeđenih argumenata u stog. Na primjer, u danima DOS-a (iskreno priznajem, ne znam kako to sada izgleda u Windows okruženju), C je pisao argumente s kraja liste, drugim jezicima (Fortran, Pascal, Basic) - s početka.
  • Standardno se koriste različiti principi prosljeđivanja parametara - po referenci ili po vrijednosti.
  • Različiti principi za pohranjivanje string varijabli. Na primjer, u C (kao i u Fortranu i Pascalu), dužina stringa je određena nultim bajtom na njegovom kraju, ali u Basic-u dužina je eksplicitno zapisana u deskriptoru stringa. Naravno, morate imati na umu mogućnost korištenja različitih kodiranja znakova.
  • Prilikom prijenosa višedimenzionalnih nizova, treba imati na umu 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, dokazane metode za prosljeđivanje argumenata DLL funkcijama. Standardi usvojeni za Win API su sasvim prikladni kao model.
  • Nikada nemojte prosljeđivati ​​nizove varijabli niza.
  • Budite vrlo oprezni kada prosljeđujete jednostavne string varijable i višedimenzionalne nizove.
  • Obavezno posebno provjerite funkcionalnost mehanizma za prosljeđivanje argumenata pozvanoj proceduri i natrag. Napišite poseban test za provjeru prijenosa podataka. Zasebno provjerite da li je svaki argument ispravno proslijeđen. Na primjer, ako imate proceduru s nekoliko argumenata, prvo provjerite da li je svaki parametar ispravno proslijeđen za opciju s jednim argumentom, a tek onda za cijelu listu.

Ali šta ako je DLL funkcija već napisana, na primjer, u Fortranu, ali njen ulazni interfejs se ne uklapa baš dobro u gore navedene VB standarde? Ovdje postoje dva savjeta. Prvo: napišite probnu DLL funkciju i koristite je da pokušate pronaći željeni poziv iz VB programa koristeći pokušaje i greške. Drugo: napišite adaptornu proceduru u istom Fortranu koja bi omogućila jednostavan interfejs između VB-a i DLL funkcije sa konverzijom jednostavnih struktura podataka u složene (na primer, konvertujte višedimenzionalni niz bajtova u niz nizova).

Dakle: koristite DLL funkcije. Ali budite na oprezu...

Computer Press 9"2000

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

API je eksterno sučelje za programiranje aplikacije, pristupanje stranicama pomoću specifičnog protokola za dobijanje informacija i pojednostavljen razvoj programa povezanih sa internim uslugama.

Šta znači API?

Najjednostavnija analogija za korištenje API-ja bila bi korištenje kalkulatora za izvođenje složenih proračuna. Recimo da imate zadatak, možete razumjeti njegovu suštinu, graditi jednadžbe i grafikone, ali ne znate izvoditi aritmetičke operacije s brojevima. Pored vas se nalazi kalkulator koji ove operacije može obaviti s lakoćom. Ne znate šta se dešava u kompjuteru, a ni ne morate da znate. Informacije dajete u jednom obliku, a primate ih u drugom, neophodnom za vaše potrebe.

Svaki API radi na ovom principu. Ne zanima vas kako program dobija odgovor, kojom putanjom se zahtjev kreće unutar njega, kako se izvode proračuni. Sigurni ste samo u jedno - kao odgovor će biti date standardizirane informacije o uspjehu operacije ili njenoj grešci.

API sučelje vam omogućava da ne gubite vrijeme, novac i trud na kupovinu “novog bicikla”. Dobijate radni informativni port koji prima i šalje potrebne količine podataka za potrebe vašeg razvoja.

Pros:

  • Ušteda na razvoju sopstvenog interfejsa.
  • Nema potrebe za razumijevanjem nijansi problema.
  • API-je razvijaju profesionalci i uzimaju u obzir sve faktore internih procesa kojih možda niste svjesni kada kreirate svoje rješenje.
  • Omogućava vam komunikaciju sa uslugama koje su zatvorene preko drugih protokola.

Minusi:

  • Ako se ciljna usluga ažurira, API ne dobiva uvijek punu funkcionalnost.
  • Ne možete uhvatiti greške i ne znate kako proces funkcionira u tuđem kodu.
  • API ne daje uvijek najoptimiziraniji rezultat u smislu vremena, budući da je dizajniran za rješavanje općih slučajeva, a ne specifičnih.

API primjeri

API integracija je proces povezivanja aplikacije sa eksternim interfejsom podataka. Rad sa API-jem počinje proučavanjem dokumentacije i korištenih protokola, a zatim direktno integracijom vašeg programa u sučelje. Pogledajmo najpopularnije servise koji imaju svoj API.

VKAPI

Eksterni interfejs za interakciju popularne društvene mreže VKontakte sa klijentima, kao i sa pretraživačima i serverskim aplikacijama. Omogućava vam upravljanje porukama zajednice, naslovnicama grupa, korisničkim stranicama ako imate odgovarajuće pristupne ključeve.

Svi zahtjevi se upućuju 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 Telegram messengeru. Nakon kreiranja bota putem @botfather i pribavljanja potrebnih pristupnih ključeva, možete započeti interakciju sa 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 glavnu adresu. Odgovor dolazi u JSON formatu.

OTVORI API VREMENSKA MAPA

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

Format: HTTP prenos preko api.openweathermap.org/data/2.5/weather?id= sa naznakom identifikacionog broja željenog grada. Odgovor servera: JSON.

GOOGLE MAPS API

Što može biti ljepše od interaktivne mape svijeta na web stranici? Pogotovo ako ovo nije umetak šablona sa Google Maps, već vaše lično izdanje popularne mape sa ličnim grupama markera. Mapa će komunicirati s drugim skriptama na stranici, slati informacije o klikovima i koordinatama.

Google Maps JavaScript API nudi slične mogućnosti. Modul je potpuno skriptiran i radi na strani pretraživača, tako da nam nisu potrebni HTTP zahtjevi od PHP-a i formiranje zaglavlja na strani servera, kao što je 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,
title: "Zdravo!"
});

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

Ima dosta korisnih funkcija.

Prvi aspekt

Možete uspostaviti interaktivnu interakciju korisnika sa društvenim mrežama i instant messengerima, koristiti mogućnosti računarskih sistema trećih strana da prikažete kurseve, vremensku prognozu i druge važne informacije.

Koristeći API, možete trenutno povezati druge resurse i softverska rješenja sa serverima, za što bi obično bile potrebne sedmice razvoja. API pojednostavljuje život tamo gdje nije potrebna jedinstvena implementacija, a pouzdanost i sigurnost su prioritet.

Drugi aspekt

Ako ste vlasnik složene računarske snage, popularne usluge ili skladištenja podataka za javni ili polu-privatni pristup, onda bi dobar potez bio da podignete svoj vlastiti API. Šta će dati:

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

Treći aspekt

Skoro isto kao i drugi. Ali bez potrebe za implementacijom API-ja otvorenog pristupa. Ako imate portal i želite da kreirate mobilnu aplikaciju za njega na Android/IOS, onda je prepisivanje sistema pod jednim API-jem najbolje rešenje. Celokupna struktura podataka je sistematizovana. Stranica i aplikacija će funkcionirati kroz jedinstvene kanale podataka.

Ovaj kratkoročni rok dobro je poznat svima koji imaju barem malo iskustva sa razvojem. Ali ne razumiju svi šta to tačno znači i zašto je potrebno. Developer Peter Gazarov govorio o API-ju jednostavnim riječima na svom blogu.

Skraćenica API je skraćenica od “Application Programming Interface” (interfejs za programiranje aplikacije, interfejs za programiranje aplikacije). Većina velikih kompanija u nekoj fazi razvija 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 serveri

WWW se može zamisliti kao ogromna mreža međusobno povezanih servera na kojima je pohranjena svaka stranica. Običan laptop može se pretvoriti u server koji može opsluživati ​​cijelu web stranicu na mreži, a programeri koriste lokalne servere za kreiranje web stranica prije nego što ih otvore širokom krugu korisnika.

Kada se unese u adresnu traku pretraživača www.facebook.com Odgovarajući zahtjev se šalje udaljenom Facebook serveru. Kada pretraživač primi odgovor, tumači kod i prikazuje stranicu.

Svaki put kada korisnik posjeti stranicu na Internetu, on stupa u interakciju s API-jem udaljenog servera. API je sastavni dio servera koji prima zahtjeve i šalje odgovore.

API kao način služenja klijentima

Mnoge kompanije nude API-je kao gotov proizvod. Na primjer, Weather Underground prodaje pristup svom API-ju za vremenske podatke.

Scenarij upotrebe: Na web stranici male kompanije postoji obrazac za zakazivanje termina za klijente. Kompanija želi da integriše Google kalendar u njega kako bi kupcima dala mogućnost da automatski kreiraju događaj i unesu detalje o predstojećem sastanku.

API aplikacija: Cilj je da server stranice direktno kontaktira Google server sa zahtjevom da kreira događaj sa navedenim detaljima, primi Googleov odgovor, obradi ga i pošalje odgovarajuće informacije pregledniku, na primjer, poruku potvrde korisniku .

Alternativno, pretraživač može uputiti zahtjev Googleovom serverskom API-ju bez prolaska kroz server kompanije.

Po čemu se API Google kalendara razlikuje od API-ja bilo kojeg drugog udaljenog servera na mreži?

Tehnički, razlika je u formatu zahtjeva i odgovora. Za generiranje cijele web stranice, pretraživač očekuje odgovor u HTML markup jeziku, dok će Google Calendar API jednostavno vratiti podatke u formatu kao što je JSON.

Ako zahtjev API-ju uputi server web stranice kompanije, onda je to klijent (kao što je pretraživač klijent kada korisnik otvori web stranicu).

Zahvaljujući API-ju, korisnik dobija priliku da izvrši radnju bez napuštanja web stranice kompanije.

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 servera, koji međusobno komuniciraju koristeći API. Serveri koji obavljaju funkciju podrške glavnom poslužitelju aplikacija nazivaju se mikroservisima.

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

Takvi zahtjevi se često mogu poslati preko pretraživača. Pošto se HTTP prenos podataka dešava u tekstualnom obliku, pretraživač će uvek moći da prikaže odgovor. Na primjer, preko pretraživača možete direktno pristupiti GitHub API-ju (https://api.github.com/users/petrgazarov), bez tokena za pristup, i primiti ovaj odgovor u JSON formatu:

Pretraživač savršeno prikazuje JSON odgovor, koji se može umetnuti u kod. Dovoljno je lako izdvojiti podatke iz takvog teksta da ih koristite po svom nahođenju.

Još nekoliko primjera API-ja

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

  • komad softvera sa specifičnom funkcijom,
  • cijeli server, cijelu aplikaciju ili samo poseban dio aplikacije.

Svaki komad softvera koji se može jasno razlikovati od okruženja može zamijeniti slovo “A” u engleskoj skraćenici, 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 komad softvera, biblioteka će imati neku vrstu API-ja koji joj omogućava interakciju s ostatkom koda aplikacije.

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

Najbolji članci na ovu temu