Ist es dennoch sinnvoll, WinAPI-Programmierung auf niedriger Ebene zu lernen? [geschlossen]

  • Ist es sinnvoll, alle C # -verwalteten Glückseligkeiten zu haben, um zu Petzolds Programmierfenster zurückzukehren und zu versuchen, Code mit reiner WinAPI zu erstellen?

    Was kann man daraus lernen? Ist es nicht zu alt, um nützlich zu sein?

    22 August 2009
    JonikPablo
21 answer
  • Diese Frage grenzt an das Religiöse :) Aber ich gebe meine Gedanken trotzdem weiter.

    Ich finde es sehr wertvoll, die Win32-API zu lernen. Wenn nicht alle GUI-Bibliotheken (verwaltet oder nicht verwaltet) führen die meisten Aufrufe dazu, dass die Win32-API aufgerufen wird. Selbst die gründlichsten Bibliotheken decken nicht 100% der API ab, und daher gibt es immer Lücken, die durch direkte API-Aufrufe oder P / -Aufruf geschlossen werden müssen. Einige der Namen der Wrapper um die API-Aufrufe haben ähnliche Namen wie die zugrundeliegenden API-Aufrufe. Diese Namen sind jedoch nicht selbstdokumentierend. Wenn Sie also die zugrunde liegende API und die darin verwendete Terminologie verstehen, können Sie die Wrapper-APIs und ihre tatsächliche Funktionsweise besser verstehen.

    Plus, wenn Sie die zugrunde liegenden APIs kennen Wenn diese von Frameworks verwendet werden, können Sie besser entscheiden, welche Bibliotheksfunktionalität Sie in einem bestimmten Szenario verwenden sollten.

    Cheers!

    08 August 2008
    OJ.
  • Bevor ich Win32 API lernte, habe ich mich jahrelang an Standard-C / C ++ gehalten, und um es ganz auszudrücken, der "Win32 API-Lernabschnitt" ist nicht die beste technische Erfahrung meines Lebens.

    In einer Hand ist Win32-API ziemlich cool. Es ist wie eine Erweiterung der C-Standard-API (wer braucht fopen, wenn Sie CreateFile haben können. Aber ich denke, UNIX / Linux / WhateverOS haben die gleichen Gizmo-Funktionen. In Unix / Linux haben sie jedoch "Alles ist." eine Datei ". In Windows haben sie das" Alles ist ein ... Fenster "(kein Scherz! Siehe CreateWindow!).

    Auf der anderen Seite ist dies der Fall eine alte API, mit der Sie sich mit rohem C und rohem C-Wahnsinn auseinandersetzen müssen.

    • Wie würde man seiner Struktur ihre eigene Größe mitteilen, um durch ein void * Zeiger auf eine Win32-Funktion.
    • Auch das Messaging kann verwirrend sein: Das Mischen von C ++ - Objekten mit Win32-Fenstern führt zu sehr interessanten Beispielen für Problem mit Hühnern oder Eiern (lustige Momente, in denen Sie eine Art delete this ; in einer Klassenmethode schreiben).
    • Müssen Wenn Sie sich mit der Objektvererbung besser auskennen, ist das Aufteilen von Kopf und nicht optimal.
    • Und natürlich gibt es die Freude an " Warum in dieser Fracking-Welt haben sie dieses Ding auf diese Weise gemacht? " Momente, in denen Sie Ihre Tastatur einmal zu oft mit dem Kopf schlagen und mit eingravierten Schlüsseln nach Hause zurückkehren, nur weil jemand da ist Ich dachte, es wäre logischer, eine API zu schreiben, um die Änderung der Farbe eines "Fensters" zu ermöglichen, nicht durch Ändern einer seiner Eigenschaften, sondern durch Abfragen an das übergeordnete Fenster.
    • etc.

    Berücksichtigen Sie in der letzten Hand ( drei Hände ??? ), dass einige Personen, die mit älteren APIs arbeiten, selbst verwenden altes Code-Styling. Der Moment, in dem Sie " const" hören, ist für Dummys "oder" ich verwende keine Namespaces, weil sie die Laufzeitgeschwindigkeit verringern "oder das noch bessere &

    15 June 2016
    IInspectable
  • Die nativen APIs sind die "echten" Betriebssystem-APIs. Die .NET-Bibliothek ist (mit wenigen Ausnahmen) nichts weiter als ein fantastischer Wrapper. Also ja, ich würde sagen, dass jeder, der .NET mit seiner ganzen Komplexität verstehen kann, relativ banale Dinge verstehen kann, wie etwa das Gespräch mit der API, ohne dass ein Mittelstand davon profitiert > Versuchen Sie einfach, DLL Injection aus verwaltetem Code auszuführen. Es kann nicht gemacht werden. Sie werden dazu gezwungen werden, nativen Code zu schreiben, um Änderungen vorzunehmen, eine echte Unterklasse zu erstellen und ein Dutzend anderer Dinge / p>

    Bearbeiten: Auch wenn Sie P / Invoke verwenden möchten.

    08 August 2008
  • Absolut. Wenn niemand das niedrige Sprachniveau kennt, wer wird dann die Hochsprachen aktualisieren und schreiben? Wenn Sie die Grundlagen der unteren Ebene verstehen, können Sie effizienteren Code in einer höheren Sprache schreiben und außerdem effizienter debuggen.

    08 August 2008
    Ed.James R
  • Unter der Annahme, dass Sie Apps erstellen, die auf Windows abzielen:

    • kann es sicherlich informativ sein, die niedrigeren Systemebenen zu verstehen - wie sie funktionieren, wie Ihr Code mit ihnen interagiert (wenn auch nur indirekt) und wo Sie zusätzliche Optionen haben, die in den übergeordneten Abstraktionen nicht verfügbar sind.
    • Es gibt Zeiten, in denen Ihr Code funktioniert Code ist möglicherweise nicht so effizient, leistungsfähig oder präzise genug für Ihre Anforderungen.
    • In immer mehr Fällen werden jedoch Leute wie wir (die nie "unmanaged Coding" gelernt haben) dazu in der Lage sein Nehmen Sie die Programmierung ab, die wir ohne "Lernen" von Win32 zu tun versuchen.
    • Außerdem gibt es eine Vielzahl von Websites, die Arbeitsbeispiele, Codefragmente und sogar voll funktionsfähigen Quellcode bereitstellen, den Sie können. " Leverage "(leihen, plagiieren - aber überprüfen Sie, ob Sie die Lizenz oder das Urheberrecht zur Weiterverwendung einhalten!), um Lücken zu füllen, die nicht von den .NET Framework-Klassenbibliotheken (oder den Bibliotheken, die Sie herunterladen können) behandelt werden oder Lizenz).
    • Wenn Sie in Win32 die für Sie wichtigen Dinge erledigen können, ohne sich zu verstellen, und Sie gute Arbeit beim Entwickeln von wohlgeformtem, lesbarem, verwaltetem Code haben, dann ' Man könnte sagen, .NET zu beherrschen wäre eine bessere Wahl, als sich in zwei sehr unterschiedlichen Umgebungen zu verbreiten.
    • Wenn Sie häufig die Windows-Funktionen nutzen müssen, die keine gute Framework-Klassenbibliothek erhalten Dann lerne auf jeden Fall die Fähigkeiten, die du brauchst.
    • Ich persönlich habe viel zu viel Zeit damit verbracht, mir Sorgen über die "anderen Bereiche" des Codierens zu machen, die ich vermutete zu verstehen, um "gute Programme" zu produzieren, aber es gibt viele Masochisten, die denken, dass alle Bedürfnisse und Wünsche ihrer eigenen sind. Elend liebt Gesellschaft. :)

    Unter der Annahme, dass Sie Apps für die "Web 2.0" -Welt erstellen, oder wäre das genauso nützlich / vorteilhaft

    10 August 2008
    ParanoidMike
  • Analogie: Wenn Sie Autos für den Lebensunterhalt (Programmierung) bauen, ist es sehr wichtig zu wissen, wie der Motor funktioniert (Win32).

    08 August 2008
    Joel Lucsy
  • Einfache Antwort, JA.

    08 August 2008
    Stephen Cox
  • Dies ist die Antwort auf jede Frage, die wie ist. "macht es Sinn, eine einfache Sprache / api X zu lernen, auch wenn eine höhere Sprache / api Y vorhanden ist"

    JA

    Sie können Ihren Windows-PC (oder ein anderes Betriebssystem) starten. und stellen Sie diese Frage in SO, weil ein paar Jungs in Microsoft 16-Bit-Assembly-Code geschrieben haben, mit dem Ihr Betriebssystem geladen wird.

    Ihr Browser funktioniert, weil jemand in C einen Betriebssystemkern geschrieben hat, der bedient alle Anfragen Ihres Browsers.

    Es reicht bis zu Skriptsprachen.

    Groß oder klein, es gibt immer einen Markt und die Gelegenheit, etwas auf jeder Abstraktionsebene zu schreiben. Sie müssen es nur mögen und in den richtigen Job passen.

    Keine API / Sprache auf irgendeiner Abstraktionsebene ist irrelevant , es sei denn, es gibt eine bessere, die gleichzeitig konkurriert Ebene .

    Eine andere Sichtweise: Ein gutes Beispiel aus einem von Michael Abrashs Buch: Der AC-Programmierer hatte die Aufgabe, eine Funktion zum Löschen des Bildschirms zu schreiben . Da C eine bessere (höhere) Abstraktion über Assembly und alle war, kannte der Programmierer nur C und wusste es gut. Er tat sein Bestes - er bewegte den Cursor zu jeder Position auf dem Bildschirm und löschte die Figur dort. Er optimierte die Schleife und stellte sicher, dass er so schnell lief, wie er konnte. Trotzdem war es langsam ... bis ein Typ hereinkam und sagte, dass es einige BIOS / VGA-Anweisungen gibt oder etwas, das den Bildschirm sofort löschen könnte.

    Es hilft immer zu wissen, was Sie gehen weiter.

    29 May 2010
    Senthil
  • Ja, aus einigen Gründen:

    1) .net umschließt Win32-Code. .net ist in der Regel ein überlegenes System, gegen das Sie Code schreiben können. Wenn Sie jedoch etwas über die zugrunde liegende Win32-Schicht wissen (oops, WinAPI, jetzt gibt es auch 64-Bit-Code), können Sie wissen, was wirklich passiert.

    2) In dieser Volkswirtschaft ist es besser, einige Vorteile gegenüber dem anderen zu haben, wenn Sie nach einem Job suchen. Einige WinAPI-Kenntnisse können dies für Sie bereitstellen.

    3) Einige Systemaspekte sind noch nicht über das .net-Framework verfügbar. Wenn Sie auf diese Funktionen zugreifen möchten, müssen Sie sie verwenden p / invoke (dort finden Sie http://www.pinvoke.net ). Wenn Sie zumindest ein wenig WinAPI-Erfahrung haben, wird Ihr p / invoke-Entwicklungsaufwand wesentlich effizienter.

    4) (hinzugefügt) Jetzt, da Win8 schon eine Weile existiert, ist es jetzt noch auf der WinAPI aufgebaut. iOS, Android, OS / X und Linux sind alle verfügbar, aber die WinAPI wird noch viele Jahre verfügbar sein.

    08 March 2014
    Jay
  • Ich persönlich mag die Win32-API nicht wirklich, aber es lohnt sich, sie zu lernen, da die API mit der grafischen Benutzeroberfläche mehr Kontrolle und Effizienz ermöglicht als eine Sprache wie Visual Basic. Ich glaube, wenn Sie gehen Um eine lebendige Schreibsoftware zu erhalten, sollten Sie die API kennen, auch wenn Sie sie nicht direkt verwenden. Dies ist aus ähnlichen Gründen ähnlich zu den Gründen, aus denen es gut ist, C zu lernen, zum Beispiel, wie ein Strcpy-Vorgang länger dauert als das Kopieren einer Ganzzahl oder warum Sie Zeiger auf Arrays als Funktionsparameter anstelle von Arrays nach Wert verwenden sollten

    21 August 2008
    Tuan Anh Hoang-Vu