Lucian Sabo dezvoltă aplicații web bazate pe triada Apache/PHP/MySQL din 2003, deși încă din 2000 a realizat pagini web statice.
A acumulat o bogată experiență profesională ca programator web și project manager.
Din 2004 este omul din spatele CRIOSWEB - o agentie web românească.
Așa cum îi place să spună despre el, este multifuncțional, cochetând cu plăcere și
cu grafica, dar și cu muzica, lucru ce îl pasionează poate la fel de mult ca programarea clasică.
Este implicat ca programator în mai multe proiecte open-source, dar a dezvoltat și câteva aplicații freeware, printre care cunoscutul program RIOT (Radical Image Optimization Tool).
| Contact |
|
Cei care doresc sa mă contacteze o pot face telepatic.
În caz ca această tentativa nu reușește, îmi puteți trimite un email la:
luciansabo at gmail dot com
|
|
C++ Builder :: Comunicatii
Folosirea librariei dinamice tapi32.dll pentru a suna la un
numar de telefon cu ajutorul modemului.
Aceast tutorial este un punct de
plecare pentru cei ce doresc sa afle cum se pot folosi dll-uri in
programe C++. Voi folosi functii API si chiar daca exemplul a
fost creat cu CBuilder, se poate lesne intelege modul de folosire
al acestor functii si cu alte medii de programare C++. Deci in
principiu aceasta nu se doreste a fi o lectie de programare in
telefonie, ci mai degraba un exemplu de folosire a unei librarii
dinamice dll. Telefonia este un domeniu foarte interesant, dar
deosebit de dificil. V-as recomanda sa cititi documentatia
Windows TAPI din SDK pentru inceput, cu toate ca veti fi destul
de dezamagiti de lipsa exemplelor.
Ca sa rezum, pasii de folosire
ai unui dll in cadrul programului dumneavoastra c++ ar fi:
- Includerea fisierului antet
windows.h
- Declararea unei variabile
de tip HINSTANCE ce va primi handle-ul modulului.
- Definirea unui tip propriu
cu typedef, sa il denumim TIP_PROPRIU
asemeni prototipului functiei apelate
- Definirea unei variabile de
tipul anterior definit cu typedef - sa o numim procAdress
- Incarcarea librariei in
memorie cu functia LoadLibrary (vezi Win SDK) si
obtinerea unui handle la modulul dorit
- Obtinerea adresei functiei
dorite cu GetProcAdress (vezi Win SDK), adresă ce va fi
stocata intr-o variabila de tipul TIP_PROPRIU (vezi mai
sus)
- Apelarea functiei dorite cu
procAdress(<lista parametrii>) (vezi mai sus despre
procAdress)
- Eliberarea handle-ului cu
FreeLibrary(nume_handle).
Pentru a testa programul avem
nevoie in Cbuilder de un buton simplu pe form. La apasarea
butonului utilizatorul va fi intrebat daca doreste cu adevarat sa
sune la numarul 958 (ora exacta - ales de mine). Analizati
codul-sursa si comentariile mele.
//---------------------------------------------------------------------------
#include <vcl\vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma resource "*.dfm"
TForm1 *Form1;
HINSTANCE hInst; //handle la modulul ce va fi incarcat in memorie
typedef (*TAPI32) (PChar,PChar,PChar,PChar); //definim prototipul
functiei aici ca un tip de date (cam ciudat :-) dar asta e...)
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
TAPI32 procAdress; //procAdress este de tipul TAPI32 declarat mai
sus
int result;
hInst=LoadLibrary("tapi32.dll"); //incarcam libraria in
memorie
if(hInst) //daca s-a obtinut handle-ul specific
/*cu ajutorul handle-ului la modul obtinut si al numelui functiei
- tapiRequestMakeCall,
vom obtine adresa acestei functii din zona de memorie unde am
incarcat modului dll.
Prototipul functiei tapiRequestMakeCall a fost cunoscut dinainte,
si forma sa definita ca tip de date.
*/
procAdress=(TAPI32)GetProcAddress(hInst,"tapiRequestMakeCall");
if(procAdress) //daca s-a gasit adresa functiei
//daca utilizatorul chiar vrea sa sune, atunci confirma cu Yes
if(MessageBox(NULL,"Pe punntul de a suna la 958 (Ora
Exacta).\nDoriti sa continuati
?","Confirma",MB_YESNO)==IDYES)
result=procAdress("","TestTAPI","958","Nada");
//apelam functia
FreeLibrary(hInst); //eliberam handle-ul
}
//---------------------------------------------------------------------------
(c) 2003 Lucian Sabo
|