Homepage

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

Carte de oaspeți

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



Home | Despre mine | Programare | Ganduri