Programare Windows I Visual C Curs 1 [608154]

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
Denumire VersiuneVersiunea
.NET
FrameworkAnul
lansării
Visual Studio 4.0N/A1995
Visual Studio 97 5.0N/A1997
Visual Studio 6.0 6.0N/A1998
Visual Studio .NET (2002) 7.01.02002
Visual Studio .NET 2003 7.11.12003
Visual Studio 2005 8.02.02005
Visual Studio 2008 9.03.52007
Visual Studio 2010 10.04.02010
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.
Visual studio este oferit în mai multe variante: Express, Professional, Premium,
Ultimate, Test Professional.
1

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 , 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 (.NET 2.0 vine cu Windows Server 2003 și se poate instala pe versiunile
anterioare, până 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#) 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.
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).
2

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 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;
•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.
3

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 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:
oLearning[12]
oProfessional[13]
oEnterprise[14]
oRISC[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]
4

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]
oSP1 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.
oSP1 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]
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 .
5

Programare Windows I – Visual C++ Curs 1
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 și false . True false
char Poate conține valori
ASCII-128 la +127.
short Stochează numere
întregi mici -32.768 la +32.767
int Stochează numere
întregi -2,147,483,648 la 2,147,483,647.
long Stochează numere
întregi ca și int,
excepție făcând faptul
că pe unele
compilatoare este sde
două ori mai mareIn Microsoft Visual C++, long are aceeași
mărime ca și int.
__int8 Stochează numere
întregi (specif ic
Microsoft)
__int16 Stochează numere
întregi (specific
Microsoft)
__int32 Stochează numere
întregi (specific
Microsoft)
__int64 Stochează numere
întregi (specific
Microsoft)-9,223,372,036,854,775,808 la
9,223,372,036,854,775,807.
float Stochează numere în
formă zecimalăIn Visual C++, float stochează până la
șapte zecimale.
double La fel ca float, dar
precizia este mai maredouble poate stoca până la 15 zecimale
wchar_t Tip extins pentru
caractere (wide
character sau
multibyte character)
6

Programare Windows I – Visual C++ Curs 1
C++/CLI are definite două tipuri întregi suplimentare:
Tip DimensiuneDomeniu de valori
long long 8De 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 DimensiuneCLI Value Class
Bool 1System::Boolean
Char 1 System::SByte
Signed char 1System::SByte
Unsigned char 1System::SByte
Short 2System::Int16
unsigned short 2System::UInt16
Int 4System::Int32
unsigned int 4System::UInt32
Long 4System::Int32
unsigned long 4System::UInt32
long long 8System::Int64
unsigned long long 8System::UInt64
Float 4System::Single
Double 8System::Double
long double 8System::Double
wchar_t 2System::Char
7

Programare Windows I – Visual C++ Curs 1
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:
opermite un control foarte precis asupra momentului în care este distrus un obiect,
astfel folosindu-se memoria exact atât cât este nevoie;
opermite folosirea destructorilor, astfel obiectele fiind întotdeauna șterse
corespunzător.
Dezavantaje:
oriscul 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).
oriscul de a apela prea devreme operatorul delete –este o problemă mult mai gravă.
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
8

Programare Windows I – Visual C++ Curs 1
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.
oCLR-ul întreține propria memorie heap, independentă de memoria heap C++
nativă.
oCLR-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.
oCLR-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.
9

Programare Windows I – Visual C++ Curs 1
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:
oun 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;
onu se pot efectua operații aritmetice cu adresele pointerilor tracking așa cum se
poate în cazul pointerilor nativi;
otoate obiectele create în heap-ul CLR trebuie să fie referențiate de un pointer
handle.
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;
10

Programare Windows I – Visual C++ Curs 1
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.
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;
11

Programare Windows I – Visual C++ Curs 1
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;
}
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

Similar Posts