Page 1 of 1

WINVER in MFC

Posted: 14 Mar 2012, 18:59
by Marius Bancila
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?

Re: WINVER in MFC

Posted: 14 Mar 2012, 22:43
by Ovidiu Cucu
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.

Re: WINVER in MFC

Posted: 14 Mar 2012, 23:13
by cristianamarie
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.

Re: WINVER in MFC

Posted: 14 Mar 2012, 23:16
by cristianamarie
Iar primele comments de pe link il dau cu var total. Ce kkt maninca ala acolo el stie.

Re: WINVER in MFC

Posted: 14 Mar 2012, 23:30
by Marius Bancila
Mie mi se pare exact inversul lui practic.

Re: WINVER in MFC

Posted: 15 Mar 2012, 09:39
by Ovidiu Cucu
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". ;)

Re: WINVER in MFC

Posted: 15 Mar 2012, 10:31
by bu7ch3r
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

Re: WINVER in MFC

Posted: 15 Mar 2012, 13:22
by Marius Bancila
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.

Re: WINVER in MFC

Posted: 17 Mar 2012, 13:32
by Ovidiu Cucu
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.