Sunteți pe pagina 1din 13

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 aplicaţii consolă şi aplicații cu interfaţă grafică pentru toate platformele
suportate de Microsoft Windows (ex. .NET Framework, Windows Mobile etc).

Istoricul versiunilor

Versiunea
Anul
Denumire Versiune .NET
lansării
Framework
Visual Studio 4.0 N/A 1995
Visual Studio 97 5.0 N/A 1997
Visual Studio 6.0 6.0 N/A 1998
Visual Studio .NET (2002) 7.0 1.0 2002
Visual Studio .NET 2003 7.1 1.1 2003
Visual Studio 2005 8.0 2.0 2005
Visual Studio 2008 9.0 3.5 2007
Visual Studio 2010 10.0 4.0 2010
Visual Studio 2012 11.0 4.5 2011

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 începând cu Visual Studio 2008), Microsoft Visual J++/ Microsoft Visual J #
(întrerupt începând cu Visual Studio 2008), Visual InterDev (înlocuit cu Microsoft
Visual Web Developer).

Pe lângă 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.

1
Programare Windows I – Visual C++ Curs 1

Visual studio este oferit în mai multe variante: Express, Professional, Premium,
Ultimate, Test Professional.

.NET Framework este o platformă/cadru (Framework) de dezvoltare software


unitară, înzestrată cu un set mare de clase, structuri, enumerări etc., organizate într-un set
de spaţii de nume (namespaces) bazate pe un limbaj comun.
.NET Framework este o componentă livrată împreună cu sistemul de operare
Windows.
În imaginea de mai jos este sumarizat istoricul versiunilor si arată versiunea
instalată de fiecare versiune de Windows.

(sursa: http://msdn.microsoft.com)

Tehnologia .NET pune laolaltă mai multe tehnologii (ASP, XML, OOP, SOAP,
WDSL, UDDI) şi limbaje de programare (ex.: C++, VB, C#) asigurând, totodată, atât
portabilitatea codului compilat între diferite calculatoare cu sistem Windows, cât ş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 asigurându-se
interoperabilitatea între aplicaţii, indiferent de limbajul folosit pentru crearea acestora.
CLS-ul definește și un set de tipuri - Common Type System (CTS). Ca elemente de bază,
limbajele de programare au: clase, interfeţe, delegări, tipuri valoare şi referinţă, iar ca
mecanisme: moştenirea, polimorfismul şi tratarea excepţiilor. Limbajele au o platformă
comună de executare numită Common Language Runtime (CLR). Toate aceste limbaje
folosesc un ansamblul de biblioteci necesare în realizarea aplicaţiilor desktop sau Web,
numit Framework Class Library (FCL). În figura de mai jos este arhitectura pentru
.NET Framework.

2
Programare Windows I – Visual C++ Curs 1

Componenta .NET Framework este formată din compilatoare, biblioteci şi alte


executabile utile în rularea aplicaţiilor .NET. Fişierele corespunzătoare se află, în general,
în directorul C:\WINDOWS\Microsoft.NET\Framework\V2.0…. (corespunzător
versiunii instalate).

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 obţinut are extensia ".exe", dar nu este direct executabil, ci respectă
formatul unic MSIL. CLR include o maşină virtuală asemănătoare cu o maşină Java, ce
execută instrucţiunile IL rezultate în urma compilării. Maşina foloseşte un compilator
special JIT (Just In Time). Compilatorul JIT analizează codul IL corespunzător apelului
unei metode şi produce codul maşină adecvat şi eficient. El recunoaşte secvenţele de cod
pentru care s-a obţinut deja codul maşină adecvat, permiţând reutilizarea acestuia fără
recompilare, ceea ce face ca, pe parcursul rulării, aplicaţiile .NET să fie din ce în ce mai
rapide. Faptul că programul IL produs de diferitele limbaje este foarte asemănător 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 lângă 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 aplicaţiilor .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 utilizării platformei .NET Framework putem enumera:
 oferă instrumente pe care le putem folosi şi în alte programe;

3
Programare Windows I – Visual C++ Curs 1

 oferă acces uşor la baze de date;


 permite realizarea desenelor sau a altor elemente grafice.
 spaţiul de nume System::Windows::Forms conţine instrumente (controale)
ce permit implementarea elementelor interfeţei grafice cu utilizatorul;
 oferă clase care efectuează majoritatea sarcinilor uzuale cu care se
confruntă, reducând astfel timpul necesar dezvoltării aplicaţiilor.

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 2012, Visual C++ a ajuns la versiunea
10.0, fiind oferit în varianta pentru 32 biți sau 64 biți.

Mai jos este prezentat istoricul versiunii pentru 32 biți (sursa: Wikipedia
http://en.wikipedia.org/wiki/Visual_C%2B%2B)

 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:
[12]
o Learning
[13]
o Professional
[14]
o Enterprise
[15]
o RISC
 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]

4
Programare Windows I – Visual C++ Curs 1

 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]
 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]
 Visual C++ 2012 (known also as Visual C++ 11.0) was released on April 15,
2012, and it is currently the latest stable release.

5
Programare Windows I – Visual C++ Curs 1

Observații:
Microsoft Foundation Class Library (de asemenea, Microsoft Foundation
Classes sau MFC) este o bibliotecă aparținând Microsoft, care încapsulează porțiuni din
Windows API în clase de C++, formând o fundație pentru aplicațiile care rulează sub
sistemul de operare Microsoft Windows. Clasele sunt definite pentru mai multe obiecte
handle, unitățile de bază ale sistemului de operare, care definesc și obiecte grafice.
Windows API (Application Programming Interface) este o interfață destinată
programării aplicațiilor pentru sistemul de operare.
C++/CLI (Common Language Infrastructure) reprezintă specificaţiile Microsoft
pentru revizuirea limbajului Managed C++ în vederea simplificării sintaxei acestuia.
C++/CLI este disponibil numai începând cu Visual Studio (inclusiv în Express Editions).

Tipuri fundamentale de date în C++/CLI

Tip Descriere Domeniu de valori


bool Poate conţine valorile True false
true şi false .
char Poate conţine valori -128 la +127.
ASCII
short Stochează numere -32.768 la +32.767
întregi mici
int Stochează numere -2,147,483,648 la 2,147,483,647.
întregi
long Stochează numere In Microsoft Visual C++, long are
întregi ca şi int, aceeaşi mărime ca şi int.
excepţie făcând
faptul că pe unele
compilatoare este sde
două ori mai mare
__int8 Stochează numere
întregi (specific
Microsoft)
__int16 Stochează numere
întregi (specific
Microsoft)
__int32 Stochează numere
întregi (specific
Microsoft)
__int64 Stochează numere -9,223,372,036,854,775,808 la
întregi (specific 9,223,372,036,854,775,807.
Microsoft)

6
Programare Windows I – Visual C++ Curs 1

Tip Descriere Domeniu de valori


float Stochează numere în In Visual C++, float stochează până la
formă zecimală şapte zecimale.
double La fel ca float, dar double poate stoca până la 15 zecimale
precizia este mai
mare
wchar_t Tip extins pentru
caractere (wide
character sau
multibyte character)

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 până la
9,223,372,036,854,775,807
unsigned long long 8 De la 0 până la 18,446,744,073,709,551,615

Observaţie:
Pentru variabile de tip long long trebuie adăugat 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 spaţiul de nume
System.

Tip fundamental Dimensiune CLI Value Class


Bool 1 System::Boolean
Char 1 System::SByte
Signed char 1 System::SByte
Unsigned char 1 System::SByte
Short 2 System::Int16
unsigned short 2 System::UInt16
Int 4 System::Int32
unsigned int 4 System::UInt32

7
Programare Windows I – Visual C++ Curs 1

Long 4 System::Int32
unsigned long 4 System::UInt32
long long 8 System::Int64
unsigned long long 8 System::UInt64
Float 4 System::Single
Double 8 System::Double
long double 8 System::Double
wchar_t 2 System::Char

Un tip value class asociat unui tip fundamental are adăugate capabilităţi suplimentare.
Între tipul fundamental şi tipul value class asociat conversia poate fi făcută automat de
compilator.

Pe lângă 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ă
stocăm până 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 atât cât este nevoie;
o permite folosirea destructorilor, astfel obiectele fiind întotdeauna şterse
corespunzător.

Dezavantaje:
o riscul de a apela prea târziu (sau deloc) operatorul delete. Omiterea apelării
operatorului delete nu este în general fatală pentru program, dar conduce la
ocuparea memoriei mai mult decât este necesar (memory leakage). Memory leak
este o eroare de programare în care programatorul a alocat memorie pe heap
utilizând funcţiile 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 aplicaţiei poate creşte î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ă.

8
Programare Windows I – Visual C++ Curs 1

Exemplu:

//cream un obiect
Punct ^P=gcnew Punct();

//il transmitem unei funcţii


oFunctie(P);
//folosim obiectul
P->daX();//!!!!!!obiectul a fost şters în funcţie. EROARE!!!!!
...

void oFunctie(Punct ^pct){


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

Ca şi Sun Microsystems în cazul limbajului Java, Microsoft a decis că


dezavantajele gestionării manuale a alocărilor făcute depăşesc 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 urmăreşte referirile la
obiecte şi atunci când un obiect nu mai este referit, devine un candidat pentru “colectarea
gunoiului”.

Consecinţe ale acestei abordări:


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 când se face colectarea gunoiului pentru un obiect.

Observaţie: Se poate folosi în continuare operatorul delete pentru distrugerea manuală a


unui obiect.

Accesul la tipurile pentru referinţe se face prin pointeri, ceea ce afectează dimensiunea şi
viteza aplicaţiei compilate. Din aceste motive se acceptă şi tipurile pentru valori.
Obiectele de tip valoare sunt create în stiva programului. În acest caz, variabila conţine
chiar obiectul, nu un pointer către obiect. Pentru manipularea obiectului nu este necesară
dereferirea, ceea ce îmbunătăţeşte performanţele. Pentru declararea unei clase de tip
valoare se foloseşte cuvântul rezervat value iar pentru declararea unei clase pentru
referinţe se foloseşte cuvântul 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 execuție precum și a altor servicii sistem. În ceea ce priveşte
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 numeşte
cod gestionat, codul executat în afara controlului CLR numindu-se cod negestionat.
Alocarea dinamică a memoriei funcţionează diferit cu CLR.

9
Programare Windows I – Visual C++ Curs 1

o CLR-ul întreţine propria memorie heap, independentă de memoria heap C++


nativă.
o CLR-ul eliberează automat memoria alocată în memoria heap gestionată de CLR
când aceasta nu mai este utilizată, nemaifiind necesară utilizarea operatorului
delete într-un program scris pentru CLR.
o CLR-ul urmăreşte ca memoria să fie compactă, pentru evitarea fragmentărilor
(din când în când). Astfel erori de tip memory leaks şi fragmentări ale memoriei
sunt evitate.

Managementul şi curăţarea memoriei este descrisă ca „garbage collection”.


Gunoiul este reprezentat de variabilele şi obiectele şterse iar memoria heap gestionată de
CLR se numeşte garbage collection heap. Pentru alocarea memoriei în memoria heap
gestionată de CLR se foloseşte gcnew în loc de new, prefixul gc arătând 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 când acestea nu mai sunt necesare.
Colectorul de gunoi ştie când un obiect din heap nu mai este utilizat deoarece urmăreşte
toate obiectele din heap şi când nu mai există variabile spre o anumită zonă de memorie,
aceasta este eliberată. Atunci când obiectul iese din domeniul de valabilitate, memoria
alocată este recuperată de mecanismul de colectare a gunoiului, fără să fie necesar nici un
apel explicit al unei funcţii de ştergere. Aceasta este o variabilă de tip referinţă, deoarece
variabila nu conţine obiectul, ci un pointer către zona de memorie în care se află obiectul.
În acest caz memoria se alocă din zona heap gestionată, care poate forţa un proces de
colectare a gunoiului.

Important: Adresa datelor stocate în heap se poate modifica (se realizează


compactificarea acesteia de către 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ă când 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
referinţelor native din C++.

Un tracking handle este similar unui pointer nativ C++ dar există şi câteva
diferenţe semnificative:
o un tracking handle nu conţine 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 operaţii aritmetice cu adresele pointerilor tracking aşa cum se
poate în cazul pointerilor nativi;
o toate obiectele create în heap-ul CLR trebuie să fie referenţiate de un pointer
handle.

10
Programare Windows I – Visual C++ Curs 1

Memoria pentru clasele valoare este alocată implicit în stivă stack, dar se poate
stoca un asemenea obiect şi în heap utilizând operatorul gcnew.

Sintaxa pentru declararea unui Tracking Handles este:

numeTip^ numeOb;

Exemplu:

String^ cuvant;

Când se declară un handle acesta este iniţializat automat cu nullptr. Pentru a anula
explicit un handle se foloseşte cuvântul 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 iniţializează un pointer handle cu 0 atunci se converteşte
valoarea 0 la tipul obiectului referenţiat şi adresa noului obiect este memorată în pointerul
handle.

Similar pointerilor nativi, un pointer handle poate fi iniţializat în momentul


declarării.

Exemplu:

String^ mesaj = "Exemplu de initializare";

Această linie de cod crează în heap un obiect String ce conţine mesajul din
membrul drept; adresa noului obiect este conţinută de mesaj.

Se pot crea pointeri handle şi către tipuri valoare:

Exemplu:

int^ valoare = 13;

Se crează pointerul handle valoare de tip int^ şi valoare pointată în heap este 13.

Pentru deferenţiere se foloseşte tot operatorul *, similar pointerilor nativi.

Exemplu:

int rezultat = 2*(*valoare)+10;

Observaţie: Când un pointer handle apare în membrul drept al unei atribuiri nu


este necesară deferenţierea explicită pentru reţinerea valorii atribuite.

11
Programare Windows I – Visual C++ Curs 1

Exemplu:

int^ rez = 0;//se crează pointerul handle rez care pointează către
valoarea 0
rez = 2*(*valoare)+10;//în membrul drept având o valoare, compilatorul
determină automat că trebuie să deferenţieze rez.

Bineînţeles, se poate scrie:

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

Important.: Pentru ultima instrucţiune trebuie ca rez să fi fost definit şi nu doar declarat.
Un handle null nu poate fi deferenţiat.

Exemplu:

int^ rezultat; // Declarare fără 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;
}

12
Programare Windows I – Visual C++ Curs 1

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).

13

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