Sunteți pe pagina 1din 12

Programare Windows I Visual C++

Curs 1

Microsoft Visual Studio


Microsoft Visual Studio este un mediu de dezvoltare integrat (integrated development environment - IDE) de la Microsoft. Acesta poate fi folosit pentru a dezvolta aplicaii consol i aplicaii cu interfa grafic pentru toate platformele suportate de Microsoft Windows (ex. .NET Framework, Windows Mobile etc).

Istoricul versiunilor
Denumire Visual Studio Visual Studio 97 Visual Studio 6.0 Visual Studio .NET (2002) Visual Studio .NET 2003 Visual Studio 2005 Visual Studio 2008 Visual Studio 2010 Versiune 4.0 5.0 6.0 7.0 7.1 8.0 9.0 10.0 Versiunea .NET Framework N/A N/A N/A 1.0 1.1 2.0 3.5 4.0 Anul lansrii 1995 1997 1998 2002 2003 2005 2007 2010

Anterior versiunii Visual Studio 4.0 a existat Visual Basic 3, Visual C++, Visual FoxPro i Source Safe ca i produse independente. Microsoft Visual Studio ofer editor, compilator/debugger i mediu de proiectare (designer) pentru mai multe limbaje de programare. Limbaje de programare incluse: Microsoft Visual C++, Microsoft Visual C#, Microsoft Visual Basic, Microsoft Visual Web
Developer, Team Foundation Server.

Limbaje anterioare: Visual FoxPro (eliminat n 2007), Visual SourceSafe (ntrerupt ncepnd cu Visual Studio 2008), Microsoft Visual J++/ Microsoft Visual J # (ntrerupt ncepnd cu Visual Studio 2008), Visual InterDev (nlocuit cu Microsoft Visual Web Developer). Pe lng limbajele amintite anterior, Microsoft Visual Studio ofer suport i pentru alte limbaje, cum ar fi M, Python, Ruby. De asemenea, sprijin XML/XSLT, HTML/XHTML, JavaScript i CSS. Visual studio este oferit n mai multe variante: Express, Professional, Premium, Ultimate, Test Professional.

Programare Windows I Visual C++

Curs 1

.NET Framework este o platform/cadru (Framework) de dezvoltare software unitar, nzestrat cu un set mare de clase, structuri, enumerri etc., organizate ntr-un set de spaii de nume (namespaces) bazate pe un limbaj comun. .NET Framework este o component livrat mpreun cu sistemul de operare Windows (.NET 2.0 vine cu Windows Server 2003 i se poate instala pe versiunile anterioare, pn la Windows 98 inclusiv; .NET 3.0 vine instalat pe Windows Vista, Windows 7 i poate fi instalat pe versiunile Windows XP cu SP2 i Windows Server 2003 cu minimum SP1). Tehnologia .NET pune laolalt mai multe tehnologii (ASP, XML, OOP, SOAP, WDSL, UDDI) i limbaje de programare (VB, C++, C#, J#) asigurnd, totodat, att portabilitatea codului compilat ntre diferite calculatoare cu sistem Windows, ct i reutilizarea codului n programe, indiferent de limbajul de programare utilizat. Pentru a fi integrate n platforma .NET, limbajele de programare sus amintite respect un set de caracteristici de baz Common Language Specification (CLS), astfel asigurndu-se interoperabilitatea ntre aplicaii, indiferent de limbajul folosit pentru crearea acestora. CLS-ul definete i un set de tipuri - Common Type System (CTS). Ca elemente de baz, limbajele de programare au: clase, interfee, delegri, tipuri valoare i referin, iar ca mecanisme: motenirea, polimorfismul i tratarea excepiilor. Limbajele au o platform comun de executare numit Common Language Runtime (CLR). Toate aceste limbaje folosesc un ansamblul de biblioteci necesare n realizarea aplicaiilor desktop sau Web, numit Framework Class Library (FCL). n figura de mai jos este arhitectura pentru .NET Framework.

Componenta .NET Framework este format din compilatoare, biblioteci i alte executabile utile n rularea aplicaiilor .NET. Fiierele corespunztoare se afl, n general, n directorul C:\WINDOWS\Microsoft.NET\Framework\V2.0. (corespunztor versiunii instalate).

Programare Windows I Visual C++

Curs 1

Compilarea programelor
Un program scris ntr-unul dintre limbajele .NET conform Common Language Specification (CLS) este compilat n Microsoft Intermediate Language (MSIL sau IL). Codul astfel obinut are extensia ".exe", dar nu este direct executabil, ci respect formatul unic MSIL. CLR include o main virtual asemntoare cu o main Java, ce execut instruciunile IL rezultate n urma compilrii. Maina folosete un compilator special JIT (Just In Time). Compilatorul JIT analizeaz codul IL corespunztor apelului unei metode i produce codul main adecvat i eficient. El recunoate secvenele de cod pentru care s-a obinut deja codul main adecvat, permind reutilizarea acestuia fr recompilare, ceea ce face ca, pe parcursul rulrii, aplicaiile .NET s fie din ce n ce mai rapide. Faptul c programul IL produs de diferitele limbaje este foarte asemntor are ca rezultat interoperabilitatea ntre aceste limbaje. Astfel, clasele i obiectele create ntr-un limbaj specific .NET pot fi utilizate cu succes n altul. Pe lng cele de mai sus, CLR-ul se ocup i de gestionarea automat a memoriei (eliberarea automat a zonelor de memorie asociate unor date devenite inutile). Privitor la portabilitate, trebuie spus c .NET Framework are la baz standardul Common Language Infrastructure, ceea ce face ca aplicaiilor .NET s ruleze, n afar de Windows, i pe unele tipuri de Unix, Linux, Solaris, Mac OS X i alte sisteme de operare. Dintre avantajele utilizrii platformei .NET Framework putem enumera: ofer instrumente pe care le putem folosi i n alte programe; ofer acces uor la baze de date; permite realizarea desenelor sau a altor elemente grafice. spaiul de nume System::Windows::Forms conine instrumente (controale) ce permit implementarea elementelor interfeei grafice cu utilizatorul; ofer clase care efectueaz majoritatea sarcinilor uzuale cu care se confrunt, reducnd astfel timpul necesar dezvoltrii aplicaiilor.

Programare Windows I Visual C++

Curs 1

Microsoft Visual C++


Microsoft Visual C++ (abreviat MSVC) este un produs IDE (Integrated Development Environment) al Microsoft pentru C, C++ i C++/CLI. Ofer instrumente pentru dezvoltarea i depanarea codului C++, cod scris n mod special pebtru Microsoft Windows API (Aplication Programing Interface), DirectX API i Microsoft .NET Framework. Odat cu lansarea Microsoft Visual Studio 2010, Visual C++ a ajuns la versiunea 10.0, fiind oferit n varianta pentru 32 bii sau 64 bii. Mai jos este prezentat istoricul versiunii pentru 32 bii (sursa: Wikipedia http://en.wikipedia.org/wiki/Visual_C%2B%2B)

o o o o

Visual C++ 1.0 (original name: Visual C++ 32-bit Edition) was the first version for 32-bit development.[7] Although released when 16-bit 1.5 was available, it did not include support for OLE2 and ODBC Visual C++ 2.0, which included MFC 3.0, was the first version to be 32-bit only. Visual C++ 4.0, which included MFC 4.0, was designed for Windows 95 and Windows NT. Visual C++ 4.2 did not support Windows 3.x (Win32s) development.[10] This was the final version with a cross-platform edition for the Macintosh available and it differed from the 2.x version in that it also allowed compilation for the PowerPC instruction set. Visual C++ 5.0, which included MFC 4.21, was a major upgrade from 4.2.[11] Available in four editions: Learning[12] Professional[13] Enterprise[14] RISC[15] Visual C++ 6.0 (commonly known as VC6), which included MFC 6.0, was released in 1998.[16] The release was somewhat controversial since it did not include an expected update to MFC. Visual C++ 6.0 is still quite popular and often used to maintain legacy projects. There are, however, issues with this version under Windows XP, especially under the debugging mode (for example, the values of static variables do not display). The debugging issues can be solved with a patch called the "Visual C++ 6.0 Processor Pack".[17] Visual C++ .NET 2002 (known also as Visual C++ 7.0), which included MFC 7.0, was released in 2002 with support for link time code generation and debugging runtime checks, .NET 1.0, and Visual C# and Managed C++. The new user interface used many of the hot keys and conventions of Visual Basic, which accounted for some of its unpopularity among C++ developers.[citation needed]

Programare Windows I Visual C++

Curs 1

Visual C++ .NET 2003 (known also as Visual C++ 7.1), which included MFC 7.1, was released in 2003 along with.NET 1.1 and was a major upgrade to Visual C++ .NET 2002. It was considered a patch to Visual C++ .NET 2002. Accordingly, the English language upgrade version of Visual Studio .NET 2003 shipped for minimal cost to owners of the English language version of Visual Studio .NET 2002. This was the last version to support Windows 95 as a target.[citation needed] eMbedded Visual C++ in various versions was used to develop for some versions of the Windows CE operating system. Initially it replaced a development environment consisting of tools added onto Visual C++ 6.0. eMbedded Visual C++ was replaced as a separate development environment by Microsoft Visual Studio 2005. Visual C++ 2005 (known also as Visual C++ 8.0), which included MFC 8.0, was released in November 2005. This version supports .NET 2.0 and dropped Managed C++ for C++/CLI. Managed C++ for CLI is still available via compiler options though. It also introduced OpenMP. With Visual C++ 2005, Microsoft also introduced Team Foundation Server. Visual C++ 8.0 has problems compiling MFC AppWizard projects that were created using Visual Studio 6.0, so maintenance of legacy projects can be continued with the original IDE if rewriting was not feasible. Visual C++ 2005 is the last version to be able to target Windows 98, Windows Me and Windows NT 4.0. [18] [19] o SP1 version also available in Microsoft Windows SDK Update for Windows Vista. Version number: 14.00.50727.762 Visual C++ 2008 (known also as Visual C++ 9.0) was released in November 2007. This version supports .NET 3.5. Managed C++ for CLI is still available via compiler options. By default, all applications compiled against the Visual C++ 2008 Runtimes (static and dynamic linking) will only work under Windows 2000 and later. [20] [21] A feature pack released for VC9, later included into SP1, added support for C++ TR1 library extensions. o SP1 version also available in Microsoft Windows SDK for Windows 7. Version number: 15.00.30729.01 Visual C++ 2010 (known also as Visual C++ 10.0) was released on April 12, 2010, and it is currently the latest stable release. It uses a SQL Server Compact database to store information about the source code, including IntelliSense information, for better IntelliSense and code-completion support.[22] This version adds a modern C++ parallel computing library called the Parallel Patterns Library, partial support for C++0x, significantly improved IntelliSense, and performance improvements to both the compiler and generated code.[23] Observaii: Microsoft Foundation Class Library (de asemenea, Microsoft Foundation Classes sau MFC) este o bibliotec aparinnd Microsoft, care ncapsuleaz poriuni din Windows API n clase de C++, formnd o fundaie pentru aplicaiile care ruleaz sub sistemul de operare Microsoft Windows. Clasele sunt definite pentru mai multe obiecte handle, unitile de baz ale sistemului de operare, care definesc i obiecte grafice. Windows API (Application Programming Interface) este o interfa destinat programrii aplicaiilor pentru sistemul de operare.

Programare Windows I Visual C++

Curs 1

C++/CLI (Common Language Infrastructure) reprezint specificaiile Microsoft pentru revizuirea limbajului Managed C++ n vederea simplificrii sintaxei acestuia. C+ +/CLI este disponibil numai ncepnd cu Visual Studio (inclusiv n Express Editions).

Tipuri fundamentale de date n C++/CLI


Tip bool char short int long Descriere Domeniu de valori Poate conine valorile True false true i false . Poate conine valori -128 la +127. ASCII Stocheaz numere -32.768 la +32.767 ntregi mici Stocheaz numere -2,147,483,648 la 2,147,483,647. ntregi Stocheaz numere In Microsoft Visual C++, long are aceeai ntregi ca i int, mrime ca i int. excepie fcnd faptul c pe unele compilatoare este sde dou ori mai mare Stocheaz numere ntregi (specific Microsoft) Stocheaz numere ntregi (specific Microsoft) Stocheaz numere ntregi (specific Microsoft) Stocheaz numere -9,223,372,036,854,775,808 la ntregi (specific 9,223,372,036,854,775,807. Microsoft) Stocheaz numere n In Visual C++, float stocheaz pn la form zecimal apte zecimale. La fel ca float, dar double poate stoca pn la 15 zecimale precizia este mai mare Tip extins pentru caractere (wide character sau multibyte character)

__int8

__int16

__int32

__int64

float double wchar_t

Programare Windows I Visual C++

Curs 1

C++/CLI are definite dou tipuri ntregi suplimentare: Tip Dimensiune Domeniu de valori long long 8 De la -9,223,372,036,854,775,808 pn 9,223,372,036,854,775,807 unsigned long long 8 De la 0 pn la 18,446,744,073,709,551,615

la

Observaie: Pentru variabile de tip long long trebuie adugat la final LL sau ll respectiv (ULL sau ull)
long long big = 123456789LL; unsigned long long imens = 999999999999999ULL;

Un tip fundamental ntr-un program C++/CLI este un tip value class. Fiecare tip fundamental ISO/ANSI are un corespondent value class definit n spaiul de nume System. Tip fundamental Bool Char Signed char Unsigned char Short unsigned short Int unsigned int Long unsigned long long long unsigned long long Float Double long double wchar_t Dimensiune 1 1 1 1 2 2 4 4 4 4 8 8 4 8 8 2 CLI Value Class System::Boolean System::SByte System::SByte System::SByte System::Int16 System::UInt16 System::Int32 System::UInt32 System::Int32 System::UInt32 System::Int64 System::UInt64 System::Single System::Double System::Double System::Char

Programare Windows I Visual C++

Curs 1

Un tip value class asociat unui tip fundamental are adugate capabiliti suplimentare. ntre tipul fundamental i tipul value class asociat conversia poate fi fcut automat de compilator. Pe lng tipurile value class asociate tipurilor standard mai exist multe alte tipuri de date, cum ar fi de exemplu tipul String ( care este utilizat pentru reprezentarea irurilor de caractere) i tipul System::Decimal utilizat pentru numerele pentru care dorim s stocm pn la 28 de zecimale.

Gestionarea automat a memoriei


Prin intermediul operatorilor new i delete, n C++, programatorul gestioneaz manual memoria ceea ce confer avantaje dar i dezavantaje. Avantaje: o permite un control foarte precis asupra momentului n care este distrus un obiect, astfel folosindu-se memoria exact att ct este nevoie; o permite folosirea destructorilor, astfel obiectele fiind ntotdeauna terse corespunztor. Dezavantaje: o riscul de a apela prea trziu (sau deloc) operatorul delete. Omiterea apelrii operatorului delete nu este n general fatal pentru program, dar conduce la ocuparea memoriei mai mult dect este necesar (memory leakage). Memory leak este o eroare de programare n care programatorul a alocat memorie pe heap utiliznd funciile din libraria standard C (malloc, calloc, realloc) sau operatorul C++ new, dar nu a mai dezalocat memoria alocata . Acest fapt reprezint o problem deoarece consumul de memorie al aplicaiei poate crete n mod necontrolat. Problema devine critic mai ales n cazul aplicatiilor care trebuie sa ruleze un timp ndelungat (de exemplu un server de baza de date, sau un server web, un filesystem ... etc). o riscul de a apela prea devreme operatorul delete este o problem mult mai grav. Exemplu:
//cream un obiect Punct ^P=gcnew Punct(); //il transmitem unei funcii oFunctie(P); //folosim obiectul P->daX();//!!!!!!obiectul a fost ters n funcie. EROARE!!!!! ... void oFunctie(Punct ^pct){ //folosete obiectul

Programare Windows I Visual C++


pct->daX(); //s-a terminat de folosit obiectul??? delete pct;

Curs 1

Ca i Sun Microsystems n cazul limbajului Java, Microsoft a decis c dezavantajele gestionrii manuale a alocrilor fcute depesc avantajele oferite, de aceea s-a trecut la gestionarea automat a memoriei. Se pot crea n continuare obiecte n mod dinamic, dar tergerea obiectelor intr n responsabilitatea sistemului, nu a programatorului. Sistemul urmrete referirile la obiecte i atunci cnd un obiect nu mai este referit, devine un candidat pentru colectarea gunoiului. Consecine ale acestei abordri: 1. obiectele sunt create ntotdeauna folosind operatorul gcnew; 2. accesul la obiecte trebuie s se fac printr-o referi, care n C++ este pointerul; 3. nu se poate ti cnd se face colectarea gunoiului pentru un obiect. Observaie: Se poate folosi n continuare operatorul delete pentru distrugerea manual a unui obiect. Accesul la tipurile pentru referine se face prin pointeri, ceea ce afecteaz dimensiunea i viteza aplicaiei compilate. Din aceste motive se accept i tipurile pentru valori. Obiectele de tip valoare sunt create n stiva programului. n acest caz, variabila conine chiar obiectul, nu un pointer ctre obiect. Pentru manipularea obiectului nu este necesar dereferirea, ceea ce mbuntete performanele. Pentru declararea unei clase de tip valoare se folosete cuvntul rezervat value iar pentru declararea unei clase pentru referine se folosete cuvntul rezervat ref. Clasele tip valoare nu suport constructori sau destructori. Dup cum a fost prezentat anterior, CLR-ul este acela care se ocup de management-ul memoriei, al firelor de execuie precum i a altor servicii sistem. n ceea ce privete securitatea, orice component managed are diferite grade de securitate n functie de anumiti factori printre care este inclus i originea lor. Codul rulat de CLR se numete cod gestionat, codul executat n afara controlului CLR numindu-se cod negestionat. Alocarea dinamic a memoriei funcioneaz diferit cu CLR. o CLR-ul ntreine propria memorie heap, independent de memoria heap C++ nativ. o CLR-ul elibereaz automat memoria alocat n memoria heap gestionat de CLR cnd aceasta nu mai este utilizat, nemaifiind necesar utilizarea operatorului delete ntr-un program scris pentru CLR. o CLR-ul urmrete ca memoria s fie compact, pentru evitarea fragmentrilor (din cnd n cnd). Astfel erori de tip memory leaks i fragmentri ale memoriei sunt evitate.

Programare Windows I Visual C++

Curs 1

Managementul i curarea memoriei este descris ca garbage collection. Gunoiul este reprezentat de variabilele i obiectele terse iar memoria heap gestionat de CLR se numete garbage collection heap. Pentru alocarea memoriei n memoria heap gestionat de CLR se folosete gcnew n loc de new, prefixul gc artnd c alocarea se face n garbage collection heap i nu n memoria heap nativ. Colectorul de gunoi CLR este capabil s tearg obiecte i s elibereze memorie cnd acestea nu mai sunt necesare. Colectorul de gunoi tie cnd un obiect din heap nu mai este utilizat deoarece urmrete toate obiectele din heap i cnd nu mai exist variabile spre o anumit zon de memorie, aceasta este eliberat. Atunci cnd obiectul iese din domeniul de valabilitate, memoria alocat este recuperat de mecanismul de colectare a gunoiului, fr s fie necesar nici un apel explicit al unei funcii de tergere. Aceasta este o variabil de tip referin, deoarece variabila nu conine obiectul, ci un pointer ctre zona de memorie n care se afl obiectul. n acest caz memoria se aloc din zona heap gestionat, care poate fora un proces de colectare a gunoiului. Important: Adresa datelor stocate n heap se poate modifica (se realizeaz compactificarea acesteia de ctre colectorul de gunoi), prin urmare nu se pot utiliza pointerii nativi C++ (adresa unui obiect gestionat se poate modifica). Cele de mai sus arat c este necesar o cale de accesare a obiectelor din heap ce s permit ca adresa s poat fi modificat cnd colectorul de gunoi reloc elementele din heap. Acest lucru poate fi realizat cu tracking handle ( sau mai simplu handle) care este un echivalent al pointerilor nativi C++ i cu tracking reference care este un echivalent al referinelor native din C++. Un tracking handle este similar unui pointer nativ C++ dar exist i cteva diferene semnificative: o un tracking handle nu conine o adres, aceasta fiind actualizat n mod automat de colectorul de gunoi dac obiectul este mutat n urma procesului de compactificare a memoriei heap; o nu se pot efectua operaii aritmetice cu adresele pointerilor tracking aa cum se poate n cazul pointerilor nativi; o toate obiectele create n heap-ul CLR trebuie s fie refereniate de un pointer handle. Memoria pentru clasele valoare este alocat implicit n stiv stack, dar se poate stoca un asemenea obiect i n heap utiliznd operatorul gcnew. Sintaxa pentru declararea unui Tracking Handles este:
numeTip^ numeOb;

Exemplu:
String^ cuvant;

10

Programare Windows I Visual C++

Curs 1

Cnd se declar un handle acesta este iniializat automat cu nullptr. Pentru a anula explicit un handle se folosete cuvntul rezervat nullptr, ca n exemplul de mai jos:
cuvant = nullptr;

Important: Nu se poate utiliza 0 pentru a anula un pointer handle ca n cazul pointerilor nativi. Dac se iniializeaz un pointer handle cu 0 atunci se convertete valoarea 0 la tipul obiectului refereniat i adresa noului obiect este memorat n pointerul handle. Similar pointerilor nativi, un pointer handle poate fi iniializat n momentul declarrii. Exemplu:
String^ mesaj = "Exemplu de initializare";

Aceast linie de cod creaz n heap un obiect String ce conine mesajul din membrul drept; adresa noului obiect este coninut de mesaj. Se pot crea pointeri handle i ctre tipuri valoare: Exemplu:
int^ valoare = 13;

Se creaz pointerul handle valoare de tip int^ i valoare pointat n heap este 13. Pentru defereniere se folosete tot operatorul *, similar pointerilor nativi. Exemplu:
int rezultat = 2*(*valoare)+10;

Observaie: Cnd un pointer handle apare n membrul drept al unei atribuiri nu este necesar deferenierea explicit pentru reinerea valorii atribuite. Exemplu:
int^ rez = 0;//se creaz pointerul handle rez care pointeaz ctre valoarea 0 rez = 2*(*valoare)+10;//n membrul drept avnd o valoare, compilatorul determin automat c trebuie s deferenieze rez.

Bineneles, se poate scrie:


*rez = 2*(*valoare)+10;

11

Programare Windows I Visual C++

Curs 1

Important.: Pentru ultima instruciune trebuie ca rez s fi fost definit i nu doar declarat. Un handle null nu poate fi defereniat.

Exemplu:
int^ rezultat; // Declarare fr definire *rezultat =2*(*valoare)+10; // Error message - unhandled exception

Exemplu ( C++/CLI):
// Exemplu.cpp : main project file. #include "stdafx.h" using namespace System; class A{ public: ~A(){Console::WriteLine("Am distrus un obiect al clasei A");} }; value class B{ //clasele tip valoare nu suporta constructori sau destructori }; ref class C{ public: ~C(){Console::WriteLine("Am distrus un obiect al clasei C");} }; void functieTest(){ A *a1=new A(),a2; B b; C ^c=gcnew C(); } int main(){ functieTest(); Console::WriteLine("Sfarsit aplicatie"); return 0; }

Am distrus un obiect al clasei A Sfarsit aplicatie Am distrus un obiect al clasei C Press any key to continue

Se observ ca numai un obiect al clase A a fost distrus (a2).

12

S-ar putea să vă placă și