WINVER in MFC

Intrebari legate de programarea cu biblioteci precum MFC, ATL, WTL si GDI+.
Post Reply
User avatar
Marius Bancila
Fondator
Fondator
Posts: 2344
Joined: 11 Jul 2007, 11:45
Judet: Timiş
Location: Timisoara
Contact:

WINVER in MFC

Post by Marius Bancila » 14 Mar 2012, 18:59

Intr-un post recent http://blogs.msdn.com/b/vcblog/archive/ ... 82397.aspx, Pat Brenner, principalul developer al MFC explica despre cum ar trebui setat WINVER in aplicatiile MFC (si ATL). El zice asa:
  • seteaza WINVER la cel mai nou OS pe care vrei sa-l suporti
  • dar incarca toate API-ruile care nu exista pe cel mai vechi OS ce vrei sa-l suporti in mod dinamic (LoadLibrary/GetProcAddress)
Mie mi se pare fara sens, pentru ca asta poate duce la multe probleme. Daca setezi WINVER la cea mai veche versiune ce vrei s-o suporti, in momentul cand vrei sa folosesti un API ce exista doar incepand cu o versiune mai noua compilatorul iti arunca eroare. Te prinzi instant. Altfel nu ai de unde sa sti decat citind documentatia cu mare atentie, ceea ce putina lume face. Plus ca daca nu iti testezi aplicatia pe toate versiunile mai vechi nu esti sigur cum merge (si asta iar stim ca se intampla des in practica).

Ce parere aveti de sfatul lui?


Marius Bancila
Fondator Codexpert, Microsoft MVP VC++
Site personal | Blog

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3778
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: WINVER in MFC

Post by Ovidiu Cucu » 14 Mar 2012, 22:43

Daca in requirements scrie "NT4.0" ce facem, aruncam la gunoi tot ce s-a bagat in Windows de-atunci incoace?
Chiar au iesit la pensie toti programatorii si le-au luat locul workeri din categoria "cei multi care nu fac aia sau aia"?
  1. Sa traga un ochi in help ca sa vada cerintele unei functii, nu-i greu;
  2. Sa testeze aplicatia pe sistemul minim cu care se lauda, nu doare.
Ce spune nenea ala acolo mi se pare de bun simt practic, nicidecum gresit.

User avatar
cristianamarie
Membru++
Membru++
Posts: 480
Joined: 12 Mar 2009, 18:47
Judet: Iaşi
Location: Iasi

Re: WINVER in MFC

Post by cristianamarie » 14 Mar 2012, 23:13

Cel mai nou?? Oricum nu o sa ruleze pe unul vechi cu API nou, deci definesti constanta de OS cel mai nou dar folosesti API-ul cel mai vechi. Sau poate le plac dialoagele cu "Cannot found ordinal @322 AlphaBlend" pe NT4.

Edit: Ceea ce spune si el mai jos.
This means that you cannot call an API available only on newer platforms directly, because calling the API directly will result in an “import not found” message on the older platform and your application will simply not start. Instead, you must dynamically load (via LoadLibrary/GetProcAddress) any API that is supported only on newer platforms.
Adica o mutat problema din compilator in link - inlocuieste typedef pentru WINVER mai mare cu LoadLibrary. O scapat de typedef.
Nuclear launch detected

User avatar
cristianamarie
Membru++
Membru++
Posts: 480
Joined: 12 Mar 2009, 18:47
Judet: Iaşi
Location: Iasi

Re: WINVER in MFC

Post by cristianamarie » 14 Mar 2012, 23:16

Iar primele comments de pe link il dau cu var total. Ce kkt maninca ala acolo el stie.
Nuclear launch detected

User avatar
Marius Bancila
Fondator
Fondator
Posts: 2344
Joined: 11 Jul 2007, 11:45
Judet: Timiş
Location: Timisoara
Contact:

Re: WINVER in MFC

Post by Marius Bancila » 14 Mar 2012, 23:30

Mie mi se pare exact inversul lui practic.
Marius Bancila
Fondator Codexpert, Microsoft MVP VC++
Site personal | Blog

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3778
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: WINVER in MFC

Post by Ovidiu Cucu » 15 Mar 2012, 09:39

Cum, Cristi, aveti in 2012 un programator Windows care n-a aflat ca AlphaBlend cere "Windows 2000 and later"?
Eu zic sa-l faceti arhitect ca sa nu mai chinuie sa scrie cod. :D

In fine, de ce ne mai agitam atata timp cat se pare ca VC++11 vrea sa taie macaroana de la XP in jos?
http://www.codexpert.ro/forum/viewtopic ... =15#p13427
Sa vedem dupa aia QA, project si alti manageri si leaderi cu regula lui "#define WINVER 0x0400". ;)

User avatar
bu7ch3r
Membru++
Membru++
Posts: 326
Joined: 17 May 2011, 15:17
Judet: Iaşi
Location: Sofia
Contact:

Re: WINVER in MFC

Post by bu7ch3r » 15 Mar 2012, 10:31

Eu, personal nu setez WINVER-ul las pe Visual sa puna singurel :) Stiu, e gresit dar deobicei cand suspectez o functie o verific "gen" : "RegSetKeyValue". Dar bineinteles ma trezesc ca un produs nu merge pe XP :D
Cu stima,
Lupu Claudiu

User avatar
Marius Bancila
Fondator
Fondator
Posts: 2344
Joined: 11 Jul 2007, 11:45
Judet: Timiş
Location: Timisoara
Contact:

Re: WINVER in MFC

Post by Marius Bancila » 15 Mar 2012, 13:22

Treaba e ca in ambele abordari, trebuie sa incarci in mod dinamic API-ruile care nu sunt prezente pe cel mai vechi OS suportat. Dar daca setezi WINVER la cea mai veche versiune, ai avantajul ca compilatorul iti spune imediat ca API-ul X nu exista pe versiunea aia. Prin urmare nu vad sensul recomandarii.
Marius Bancila
Fondator Codexpert, Microsoft MVP VC++
Site personal | Blog

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3778
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: WINVER in MFC

Post by Ovidiu Cucu » 17 Mar 2012, 13:32

A facut omul o recomandare si i-au sarit in cap o suta de indivizi cu surle si trompete. :)

Eu procedez cam asa:
  1. daca o librarie nu merge pe sistemul target minim si tine de o functionalite care musa-i sa existe, n-o folosesc si caut/fac un inlocuitor.
  2. daca e vorba doar de un briz-brizuri nice to have, atunci aplic fenta cu LoadLibrary/GetProcAddress insa pastrez versiunea la maximum (sau cel mai des, ce-mi pune wizard-ul), ceea ce ma scuteste de o gasca de declaratii si definitii puse cu manuela.
In ambele cazuri, casc intai bine ochii in docomentatie si nu ma bazez pe ingeri pazitori gen WINVER si fratii sai.
Ceea ce as recomanda altora si cred ca a incercat sa spuna si nenea Pat Brenner.

Post Reply