Mai are sens să înveți programele WinAPI de nivel scăzut?

Are sens, având toate fericirea C #-gestionate, să se întoarcă în fereastra de programare Petzold și să încerce să producă cod cu WinAPI pur?

Ce poate fi învățat din ea? Nu este prea depășit pentru a fi util?

0
fr hi bn
Fixată, mulțumesc lui MarkJ.
adăugat autor Camilo Díaz Repka, sursa
Aplicațiile Web vor înlocui aplicația Windows. Aplicațiile Web funcționează printr-un browser. Browserul este o aplicație Windows.
adăugat autor Sesh, sursa
BTW e Petzold nu Petzhold.
adăugat autor MarkJ, sursa
Pompele de mesaje sunt inima lumii programării.
adăugat autor GalacticJello, sursa

15 răspunsuri

Am văzut codul API de nivel scăzut al Windows ... nu este destul ... Mi-aș dori să-l pot dezvălui. Cred ca este benefic pentru a invata un nivel scazut ca in C, pe masura ce obtineti o mai buna intelegere a arhitecturii hardware si cum functioneaza toate aceste lucruri. Învățând vechiul API Windows ... Cred că lucrurile pot fi lăsate oamenilor de la Microsoft care ar putea fi nevoiți să-l învețe pentru a construi limbi de nivel superior și API ... au construit-o, să-i lase să sufere cu asta ;-)

Cu toate acestea, dacă se întâmplă să găsești o situație în care simți că nu poți să faci ceea ce trebuie să faci într-un limbaj de nivel mai înalt (puțini și departe între ei), atunci poate începe scufundarea periculoasă în lumea asta.

0
adăugat

Este important să știți ce este disponibil cu API-ul Windows. Nu cred că trebuie să scoți codul cu el, dar ar trebui să știi cum funcționează. .NET Framework conține o mulțime de funcționalități, dar nu oferă echivalente de cod gestionat pentru întregul API Windows. Uneori trebuie să te apropii mai mult de metal și știind ce este acolo și cum se comportă, îți va oferi o mai bună înțelegere a modului de utilizare.

0
adăugat

Răspuns simplu, DA.

0
adăugat

Absolut. Când nimeni nu știe nivelul scăzut, cine va actualiza și scrie limbile de nivel înalt? De asemenea, atunci când înțelegeți chestiile de nivel scăzut, puteți scrie un cod mai eficient într-un limbaj de nivel superior și, de asemenea, puteți depana mai eficient.

0
adăugat

Learning a new programming language or technology is for one of three reasons:
1. Need: you're starting a project for building a web application and you don't know anything about ASP.NET
2. Enthusiasm: you're very excited about ASP.NET MVC. why not try that?
3. Free time: but who has that anyway.

Cel mai bun motiv pentru a afla ceva nou este Need. Dacă aveți nevoie să faceți ceva ce nu poate face cadrul .NET (cum ar fi performanța, de exemplu), atunci WinAPI este soluția dvs. Până atunci, ne ocupăm de învățarea despre .NET

0
adăugat

Pentru majoritatea nevoilor de pe desktop, nu trebuie să știți Win32, cu toate acestea, există o mulțime de Win32 nu în. NET, dar este în lucrurile de expediere care pot ajunge mai puțin de 1% din cererea dumneavoastră.

Suport USB, suport HID, Windows Media Foundation chiar în partea de sus a capului meu. Există multe aplicații cool API disponibile doar de la Win32.

Veți face o mare favoare prin a învăța cum să faceți interop cu un Win32 API, dacă faceți programare desktop, pentru că atunci când trebuie să apelați Win32 și nu veți petrece săptămâni să vă zgâriați capul.

0
adăugat

O voi pune așa. Nu-mi place programarea la API-ul Win32. Poate fi o durere în comparație cu codul gestionat. BUT, mă bucur că știu asta pentru că pot scrie programe care altfel nu aș putea. Pot scrie programe pe care alte persoane nu le pot face. În plus, vă oferă o mai bună înțelegere a ceea ce face codul dvs. gestionat în spatele scenei.

0
adăugat

Valoarea de valoare pe care o obțineți din învățarea API-ului Win32 (în afară de tipurile de informații generale pe care le obțineți despre învățarea cum se potrivesc nucile și bolțurile mașinii) depinde de ceea ce încercați să obțineți. O mulțime de API-ul Win32 a fost înfășurat frumos în clasele .NET ale bibliotecii, dar nu toate. Dacă, de exemplu, căutați să faceți o serie de programe audio grave, acea parte a API-ului Win32 ar fi un subiect excelent de studiu, deoarece doar clasele de bază sunt disponibile din clasele .NET. Ultima dată am verificat chiar că biblioteca directă DirectSound administrată a fost groaznică.


Cu riscul auto-promovării nerușinate ....

Tocmai am dat peste o situație în care API-ul Win32 a fost singura mea opțiune. Vreau să fiu foarte diferit pe fiecare articol într-o listă. Am scris cum am făcut-o pe această întrebare .

0
adăugat

Analogie: Dacă construiți mașini pentru a trăi (programare), atunci este foarte pertinent să știți cum funcționează motorul (Win32).

0
adăugat

Acest lucru este la fel ca întrebarea, ar trebui să învăț un limbaj de nivel scăzut cum ar fi C (sau chiar asamblare).

Codificarea în ea este, cu siguranță, mai lentă (desigur că rezultatul este mult mai rapid), dar adevăratul ei avantaj este că veți obține o înțelegere a ceea ce se întâmplă aproape de nivelul sistemului, mai degrabă decât să înțelegeți metafora altcuiva despre ceea ce se întâmplă .

De asemenea, poate fi mai bine atunci când lucrurile nu vor funcționa bine, sau destul de repede sau cu felul de granularitate de care aveți nevoie. (Și faceți cel puțin unele subclasări și superclasări.)

0
adăugat

Această întrebare se învecinează cu religia :) Dar oricum voi da gândurile mele.

Eu văd valoarea în folosirea Win32 API. Cele mai multe, dacă nu toate, bibliotecile GUI (gestionate sau neadministrate) generează apeluri către API-ul Win32. Chiar și cele mai complete biblioteci nu acoperă 100% din API și, prin urmare, există întotdeauna lacune care trebuie să fie conectate prin apeluri API directe sau P / invocând. Unele nume ale agregatelor din jurul apelurilor API au nume similare cu apelurile API care stau la baza, dar aceste nume nu sunt autocumentante. Așa că înțelegerea API-ului subiacent și terminologia utilizată în ea vor ajuta la înțelegerea API-urilor de înfășurare și la ceea ce fac de fapt.

În plus, dacă înțelegeți natura API-urilor de bază care sunt utilizate de cadre, atunci veți face alegeri mai bune în ceea ce privește funcționalitatea bibliotecii pe care ar trebui să o utilizați într-un anumit scenariu.

Noroc!

0
adăugat

Personal nu îmi place foarte mult API-ul Win32, dar există o valoare în învățarea lui, deoarece API va permite mai mult control și eficiență folosind GUI decât un limbaj ca Visual Basic și cred că dacă vei face un software de scris trebuie să cunoașteți API chiar dacă nu îl utilizați direct. Acest lucru se întâmplă din motive similare cu motivele pentru care este bine să înveți C, cum ar fi modul în care un strat strcpy necesită mai mult timp decât copierea unui întreg sau de ce ar trebui să folosiți pointerii în matrice ca parametri funcționali în loc de array după valoare.

0
adăugat

M-am ținut la standardul C / C ++ de ani de zile înainte de a învăța Win32 API, și pentru a fi destul de blunt, "învățarea Win32 API" parte nu este cea mai bună experiență tehnică din viața mea.

Într-o mână Win32 API este destul de rece. Este ca o extensie a API-ului standard C (care are nevoie de fopen atunci cand poti avea CreateFile ) dar cred ca UNIX / Linux / WhateverOS au aceleasi functii gizmo. Unix / Linux, ei au "Totul este un fișier". În Windows, ei au "Totul este un ... fereastră" (nu glumesc!

Pe de altă parte, acesta este un API moștenit. Veți avea de-a face cu C brut, și nebunia C prime.

  • Spre deosebire de structura propriu-zisă de a trece printr-un pointer void * la o anumită funcție Win32.
  • Mesageria poate fi destul de confuză: Amestecarea obiectelor C ++ cu ferestre Win32 duce la exemple foarte interesante de Chicken sau Egg (momente amuzante atunci când scrieți un fel de ștergeți acest lucru; într-o metodă de clasă).
  • Dacă trebuie să subclasați un WinProc atunci când sunteți mai familiarizat cu moștenirea obiectului este divizarea capului și mai puțin optimă.
  • Și, bineînțeles, există bucuria de " De ce în această lume fracking au făcut acest lucru în acest fel? " momente când vă loviți tastatura cu capul o dată prea multe și întoarce-te acasă cu cheile gravate pe frunte, tocmai pentru că cineva credea că este mai logic să scrie un API pentru a permite schimbarea culorii unui "Fereastră", nu prin schimbarea uneia dintre proprietățile sale, ci prin solicitarea la fereastra părinte.
  • etc.

În ultima mână ( trei mâini ), luați în considerare faptul că unii oameni care lucrează cu API-uri vechi utilizează ei înșiși stilul de cod vechi. Momentul în care auziți că " const este pentru manechine " sau " Nu folosesc spații de nume pentru că diminuează viteza de rulare mai bine " Hei, cine are nevoie de C ++? Cod în propria mea marcă de obiecte orientate C !!! " (Nu glumesc ... Într-un mediu profesional, iar rezultatul a fost destul de o vedere .. .), veți simți un fel de groază condamnat numai în fața ghilotina .

Deci ... În ansamblu, este o experiență interesantă .

Editați | ×

După ce am citit din nou acest post, văd că ar putea fi considerat prea negativ. Nu este.

Este uneori interesant (precum și frustrant) să știi cum funcționează lucrurile sub capotă. Veți înțelege că, în ciuda constrângerilor enorme (imposibil?), Echipa Win32 API a făcut o treabă minunată pentru a fi siguri că totul, de la dvs. "programul Win16" până la "ultima aplicație Win64 over-the-top" în trecut, acum și în viitor.

Întrebarea este: Chiar vrei să?

Deoarece petrecerea săptămânilor pentru a face lucruri care ar putea fi realizate (și realizate mai bine) în alte API-uri mai înalte și / sau orientate pe obiect pot fi destul de motivaționale (experiență reală: 3 săptămâni pentru Win API, 4 ore în trei alte limbi și / sau biblioteci).

Oricum, veți găsi blogul lui Raymond Chen foarte interesant din cauza viziunii lui insider pe ambele Win API și evoluția sa prin ani:

https://blogs.msdn.microsoft.com/oldnewthing/

0
adăugat
Nu aveți nevoie să utilizați C ++ pentru a utiliza win32api. Puteți folosi Python sau ceva care nu necesită 15 linii de crap de gestionare a memoriei înainte de a putea face o sarcină simplă.
adăugat autor jle, sursa
@jle: Da, dar folosirea API-ului Win32 prin Python este ca și cum ați folosi API-ul Win32 prin Java sau C #: Cineva deja a scris ambalajele pentru dvs. Mai mult, sper că nu codificați GUI cu Win32, deoarece chiar și cu Python, aceasta este o durere. Nu în ultimul rând, întrebarea nu conține nicio referire la Python (sau orice limbaj script), nici la eticheta "python", așa că ...
adăugat autor paercebal, sursa

Învățarea C sau o limbă inferioară poate fi cu siguranță utilă. Cu toate acestea, nu văd nici un avantaj evident în utilizarea WinAPI neangajate.

0
adăugat

Presupunând că construiți aplicații orientate spre Windows:

  • poate fi informativ să înțeleagă nivelurile inferioare ale sistemului - cum funcționează, modul în care interacționează codul cu aceștia (chiar dacă numai indirect) și unde aveți opțiuni suplimentare care nu sunt disponibile în abstracțiile de nivel superior
  • există momente în care codul dvs. poate să nu fie la fel de eficient, de înaltă performanță sau suficient de precis pentru cerințele dvs.
  • Cu toate acestea, în tot mai multe cazuri, oameni ca noi (care nu au învățat niciodată "codarea neadministrabilă") vor putea să scoată din programarea pe care încercăm să o facem fără să "învățăm" Win32.
  • Mai mult, există o mulțime de site-uri care oferă eșantioane de lucru, fragmente de cod și chiar cod sursă complet funcțional pe care le puteți "împrumuta" (împrumutați, plagiți - dar verificați dacă respectați orice licență de reutilizare sau drepturi de autor! ) pentru a completa eventualele lacune care nu sunt tratate de bibliotecile de clasă .NET (sau bibliotecile pe care le puteți descărca sau de a le elibera).
  • Dacă reușiți să eliminați faptele de care aveți nevoie fără a vă deranja în Win32 și faceți o treabă bună de a dezvolta un cod bine format și ușor de citit, atunci aș spune că mastering .NET ar fi o alegere mai bună decât răspândindu-vă subțire în două medii foarte diferite.
  • Dacă aveți nevoie frecvent să utilizați acele caracteristici ale Windows care nu au primit acoperire bibliotecă de clasă bună, atunci, prin toate mijloacele, aflați abilitățile de care aveți nevoie.
  • Am petrecut prea mult timp îngrijorând despre "alte zone" de codare pe care eu trebuie să înțelegeți să le producă "programe bune", dar există o mulțime de masochiști acolo cred că nevoile și dorințele tuturor sunt ca și ale lor. Miseria iubește compania. :)

On the assumption that you're building apps for the "Web 2.0" world, or that would be just as useful/beneficial to *NIX & MacOS users:

  • Stick cu limbi și compilatoare care vizează cât mai multe medii încrucișate.
  • pur .NET în Visual Studio este mai bine decât Win32, dar dezvoltarea în comparație cu bibliotecile MONO, probabil folosind IDE Sharp Develop, este probabil o abordare mai bună.
  • ați putea, de asemenea, să vă petreceți timpul învățând Java, iar acele abilități s-ar transfera foarte bine în programarea C# (plus codul Java ar funcționa teoretic pe orice platformă cu JRE). Am auzit că a spus că Java este mai mult ca "scrie o dată, depanare peste tot", dar este, probabil, la fel de adevărat ca (sau chiar moreso decât) C #.
0
adăugat