Macht es noch Sinn, um zu erfahren, low-level-WinAPI-Programmierung?[geschlossen]

StackOverflow https://stackoverflow.com/questions/5507

  •  08-06-2019
  •  | 
  •  

Frage

Macht es Sinn, dass alle C#-managed-bliss, zurück zu gehen, Petzold Programmierung Windows und versuchen Sie, zu produzieren-code w/ pure WinAPI?

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

War es hilfreich?

Lösung

Diese Frage steht am Rande des religiösen :) Aber ich gebe meine Gedanken sowieso.

Ich sehe Wert in learing der Win32-API.Die meisten, wenn nicht alle GUI-Bibliotheken (managed oder unmanaged) Ergebnis in Aufrufe der Win32-API.Auch die meisten Gründliche Bibliotheken decken nicht 100% der API, und daher gibt es immer Lücken, die müssen eingesteckt werden durch direkte API-Aufrufe oder P/aufrufen.Einige der Namen, die der Wrapper für die API-Aufrufe mit ähnlichen Namen, um die zugrunde liegende API-Aufrufe, aber diese Namen sind nicht gerade selbsterklärend ist.So das Verständnis der zugrunde liegenden API und der darin verwendeten Terminologie, wird Hilfe im Verständnis der wrapper-APIs und was Sie tatsächlich tun.

Plus, wenn Sie verstehen die Natur der zugrunde liegenden APIs, die von frameworks, dann werden Sie bessere Entscheidungen im Hinblick auf die library-Funktionen, die Sie verwenden sollten, in einem bestimmten Szenario.

Cheers!

Andere Tipps

Ich hielt zu standard-C/C++ für die Jahre vor dem lernen Win32 API und ziemlich stumpf, die "Lern-Win32-API" - Teil ist nicht die beste technische Erfahrung meines Lebens.

In der einen hand die Win32-API ist ziemlich cool.Es ist wie eine Erweiterung der C-standard-API (wer braucht fopen wenn Sie kann haben CreateFile.Aber ich denke, UNIX - /Linux - /WhateverOS haben die gleichen gizmo Funktionen.Sowieso, in Unix/Linux sind, haben Sie die "Alles ist eine Datei".In Windows haben Sie die "Alles ist eine...Fenster" (kein Scherz!Finden CreateWindow!).

In der anderen hand, dies ist eine legacy-API.Sie werden im Umgang mit raw-C, C-und raw-Wahnsinn.

  • Wie erzählt man die Struktur seiner eigenen Größe zu pass durch eine void * Zeiger auf einige Win32-Funktion.
  • Messaging kann ziemlich verwirrend sein, zu:Mischen von C++ - Objekte mit Win32-windows führen sehr interessante Beispiele Huhn oder Ei problem (lustige Momente, wenn Sie schreiben, eine Art delete this ; in einer Methode der Klasse).
  • Dass eine Unterklasse eines WinProc, wenn Sie mehr vertraut mit dem Objekt der Vererbung ist Kopf-splitting und weniger als optimal.
  • Und natürlich, es ist die Freude "Warum in diesem fracking Welt, die dies Taten Sie etwas auf diese Weise ??"Momente, wenn Sie schlagen Ihre Tastatur mit Ihrem Kopf einmal zu viel und wieder nach Hause mit dem Schlüssel eingraviert in die Stirn, nur weil jemand dachte, es logischer zu schreiben, eine API zu aktivieren, ändern der Farbe von einem "Fenster", nicht Sie, indem Sie eine seiner Eigenschaften, sondern durch das Fragen es an das übergeordnete Fenster.
  • etc.

In der letzten hand (drei Hände ???), betrachten, dass einige Menschen arbeiten mit legacy-APIs sind, sich mithilfe von legacy-code styling.Der moment, in dem Sie hören "const ist die für dummies"oder "Ich glaube nicht, verwenden Sie namespaces, weil Sie verringern die Laufzeit-Geschwindigkeit"oder noch besser "Hey, wer braucht C++?Ich code in meine eigene Marke in object-oriented C!!!"(Kein Scherz...In einem professionellen Umfeld, und das Ergebnis war ziemlich ein Anblick,...), fühlen Sie sich die Art von Furcht, nur verurteilt fühlen Sie sich in vor dem guillotine.

So...Alle in alle, es ist ein interessant Erfahrung.

Bearbeiten

Nach dem erneuten Lesen dieser post, ich sehe, es könnte gesehen werden als übermäßig negativ.Ist es nicht.

Es ist manchmal interessant (ebenso wie frustrierend) zu wissen, wie die Dinge funktionieren unter der Haube.Sie werden verstehen, dass trotz der enormen (unmöglich?) Einschränkungen, die Win32-API-team hat wunderbare Arbeit, um sicher zu sein alles, von der Sie "olde Win16-Programm" Ihrer "letzten Win64 over-the-top-Anwendung", können Arbeit zusammen, in der Vergangenheit, jetzt und in der Zukunft.

Die Frage ist:Wollen Sie wirklich?

Denn wochenlang Dinge zu tun, die getan werden könnte (und besser), in anderen mehr high-level-und/oder Objekt-orientierte API kann sehr de-Motivations - (real-life-Erfahrung:3 Wochen für die Win-API, gegen 4 Stunden in drei anderen Sprachen und/oder Bibliotheken).

Wie auch immer, du wirst finden, Raymond Chen ' s Blog sehr interessant wegen seiner insider-Blick auf das Win-API und dessen Entwicklung über die Jahre:

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

Absolut.Wenn niemand weiß, die niedrigen Niveau, die aktualisiert und schreiben Sie die high-level-Sprachen?Auch, wenn Sie verstehen, dass die low-level-Sachen, die Sie schreiben können, effizienteren code in einer Sprache auf höherer Ebene, und auch Debuggen effizienter zu gestalten.

Die native APIs sind die "echten" Betriebssystem-APIs.Die .NET-Bibliothek ist (mit wenigen Ausnahmen) nichts anderes als ein fancy wrapper um Sie herum.Also, ja, ich würde sagen, dass jeder, verstehen können .NETTO mit all seiner Komplexität, Sie verstehen können relativ Banale Dinge wie sprechen, um die API, ohne den Vorteil einer Mitte-Mann.

Versuchen DLL-Injektion, die von verwaltetem code.Es kann nicht getan werden.Sie werden gezwungen sein, zu schreiben nativen code für dieses, für die windowing-tweaks für echte Unterklassen, und ein Dutzend anderer Dinge.

Also ja:Sie sollten (müssen), wissen beide.

Edit:auch wenn Sie planen, verwenden Sie P/Invoke.

Auf der Annahme, dass Sie sind erstellen von apps gezielt an Windows:

  • es kann informativ sein, um zu verstehen, unteren Ebenen des Systems - wie Sie funktionieren, wie Ihr code interagiert mit Ihnen (auch wenn nur indirekt), und wo haben Sie zusätzliche Optionen, die nicht verfügbar sind in der High-level-Abstraktionen
  • es gibt Zeiten, wenn Sie Ihren code möglicherweise nicht so effizient, high-performance oder präzise genug für Ihre Anforderungen
  • Jedoch, in mehr und mehr Fällen, Leute wie uns (die nie gelernt haben, "nicht verwalteter Code"), werden in der Lage zu ziehen aus der Programmierung, wir versuchen zu tun, ohne zu "lernen" Win32.
  • Weiter, es gibt viele Websites, die bieten Arbeit Beispiele, Codefragmente und sogar voll funktionsfähige Quelle code, Sie können die "Hebelwirkung" (entlehnen, plagiieren, aber achten Sie auf die Einhaltung aller re-use-Lizenz oder das Urheberrecht!) Lücken, die nicht bearbeitet .NET framework class libraries (oder die Bibliotheken, die Sie herunterladen oder Lizenz).
  • Wenn Sie können, ziehen Sie den Heldentaten, die Sie brauchen, ohne Herumspielen in Win32, und du machst einen guten job zu entwickeln, well-formed, readable code verwalteten, dann würde ich sagen, mastering .NET wäre eine bessere Wahl, als die Verbreitung selbst zu Dünn über zwei sehr unterschiedliche Umgebungen.
  • Wenn Sie Häufig nutzen diese features von Windows, die es noch nicht bekommen haben, gut Framework class library Abdeckung, dann mit allen Mitteln, die Fähigkeiten erlernen, die Sie brauchen.
  • Ich persönlich habe verbrachte viel zu viel Zeit, sich Gedanken über die "anderen Bereiche", die Codierung, die ich bin soll um zu verstehen, zu produzieren "gute Programme", aber es gibt viele Masochisten da draußen, die denken, dass alle Ihre Bedürfnisse und Wünsche sind wie Ihre eigenen.Elend liebt Gesellschaft.:)

Auf der Annahme, dass Sie beim erstellen von apps für das "Web 2.0" - Welt, oder das wäre genauso nützlich/vorteilhaft für *NIX & MacOS-Benutzer:

  • Stick mit Sprachen und Compiler, das Ziel als viele cross-Plattform-Umgebungen möglich.
  • rein .NET in Visual Studio ist besser als Win32 offensichtlich, aber die Entwicklung gegen den MONO-Bibliotheken, vielleicht mit der Scharfen IDE Entwickeln, ist wahrscheinlich ein noch besserer Ansatz.
  • Sie könnten auch Ihre Zeit verbringen, Java zu lernen, und diese Fähigkeiten übertragen würde sehr gut in C# - Programmierung (plus der Java-code würde theoretisch auf jeder Plattform ausgeführt mit der passenden JRE).Ich habe gehört, es sagte, dass Java mehr wie "write once, debug everywhere", aber das ist wohl so wahr wie (oder sogar mehr als so manche) C#.

Analogie:Wenn Sie bauen Autos für ein Leben (Programmierung), dann ist seine sehr relevant zu wissen, wie der Motor funktioniert (Win32).

Einfache Antwort, JA.

Dies ist die Antwort auf eine Frage, wie.. "macht es Sinn, zu lernen, eine low-level Sprache/api-X, auch wenn eine höhere Ebene der Sprache/api Y ist da"

JA

Sie sind in der Lage zu Booten Sie Ihren Windows-PC (oder einem anderen OS) und stellen Sie diese Frage SO, weil ein paar Jungs in Microsoft schrieb die 16-bit-assembly-code, lädt Ihre OS.

Ihren browser funktioniert, weil jemand schrieb einen OS-kernel in C serviert alle Ihre browser-Anforderungen.

Es geht den ganzen Weg bis auf Script-Sprachen.

Groß oder klein, es gibt immer einen Markt und die Möglichkeit etwas zu schreiben, die in jeder Ebene der Abstraktion.Sie müssen nur, es zu mögen und passen in den richtigen job.

Keine api/Sprache auf jeder Ebene der Abstraktion ist, spielen keine Rolle es sei denn, es gibt einen besseren Wettbewerb auf dem gleichen Niveau.

Ein anderer Weg, es zu betrachten:Ein gutes Beispiel von einer von Michael Abrash ' s book:Ein C-Programmierer, hatte die Aufgabe, das schreiben einer Funktion, um den Bildschirm zu löschen.Da C eine bessere (höhere Ebene) Abstraktion über die Montage und alle, die Programmierer wussten nur C und kannte Sie gut.Er Tat sein bestes, er bewegt den cursor, um jede Position auf dem Bildschirm gelöscht und die Figur.Er optimiert die Schleife und machte sicher, dass es lief, so schnell es konnte.Aber es war immer noch langsam...bis einige Kerl kam herein und sagte, es gebe einige BIOS - /VGA-Anweisung oder etwas, das Sie löschen den Bildschirm sofort.

Es hilft immer zu wissen, was Sie sind gehen auf.

Ja, für ein paar Gründe:

1) .net wraps Win32-code..Netto ist in der Regel ein system überlegen, um code vor, aber mit einigen Kenntnissen der zugrunde liegende Win32-Schicht (UPS, WinAPI jetzt, dass es 64-bit-code zu) stärkt Ihr wissen, was wirklich passiert ist.

2) in dieser Wirtschaft ist es besser, einige Vorteile gegenüber den anderen Kerl, wenn Sie sind auf der Suche nach einem job.Einige WinAPI-Erlebnis bieten können, das für Sie.

3) einige Aspekte, die nicht verfügbar sind durch die .net framework noch nicht, und wenn Sie möchten, um Zugriff auf diese Funktionen müssen Sie mit p/invoke (siehe http://www.pinvoke.net für etwas Hilfe).Zumindest ein paar Brocken der WinAPI Erfahrung wird machen Ihre p/invoke-Aufwand bei der Entwicklung viel effizienter.

4) (mehr) - Nun, Win8 wurde um für eine Weile, es ist noch aufbauend auf der WinAPI.iOS -, Android -, OS/X und Linux sind alle dort, aber die WinAPI wird immer noch für viele, viele Jahre.

Das erlernen einer neuen Programmiersprache oder Technologie für ein von drei Gründen:
1.Müssen:Sie sind dabei, ein Projekt für den Aufbau einer web-Anwendung, und Sie wissen nichts über ASP.NET
2.Begeisterung:Sie sind sehr gespannt ASP.NET MVC.warum nicht versuchen?
3.Freizeit:aber wer hat das sowieso.

Der beste Grund, um etwas neues zu lernen Brauchen.Wenn Sie brauchen, um etwas zu tun, dass die .NET framework kann nicht (wie Leistung, zum Beispiel), dann WinAPI ist Ihre Lösung.Bis dahin halten wir uns selbst beschäftigt mit lernen .NET

Für die meisten Bedürfnisse auf den desktop, den Sie pflegen müssen, um zu wissen, Win32, allerdings gibt es eine MENGE von Win32 nicht .NET, aber es ist in der outlaying Sachen, die bis Ende Mai weniger als 1% von Ihre Anwendung.

USB-Unterstützung, die HID-Unterstützung, Windows-Media-Foundation nur aus der Spitze von meinem Kopf.Es gibt viele Coole Vista-API ist nur verfügbar von Win32.

Sie tun sich selbst einen großen gefallen, indem Sie lernen, wie man interop mit einer Win32-API, wenn Sie desktop-Programmierung, weil, wenn Sie tun Sie benötigen zum aufrufen von Win32-und Sie werden Sie nicht wochenlang am Kopf kratzen.

Ich persönlich weiß nicht wirklich, wie die Win32-API, aber es ist Wert zu lernen, wie die API ermöglicht eine bessere Kontrolle und Effizienz über die GUI als einer Sprache wie Visual Basic, und ich glaube, dass, wenn Sie gehen, um eine lebende schreiben software, die Sie wissen sollten, die API auch wenn Sie nicht verwenden es direkt.Dies ist aus ähnlichen Gründen auf die Gründe, es ist gut, C zu lernen, wie ein strcpy mehr Zeit in Anspruch nimmt als das kopieren einer integer-oder warum sollten Sie verwenden, Zeiger auf arrays als Funktions-Parameter anstelle von arrays durch Wert.

Lernen Sie C oder einer niedrigeren Stufe kann die Sprache auf jeden Fall nützlich sein.Jedoch, ich sehe keinen offensichtlichen Vorteil mit der nicht verwalteten WinAPI.

Ich habe gesehen, low-level Windows API code...es ist nicht schön...Ich wünschte, ich könnte verlernen es.Ich denke, dass es Vorteile zu erfahren niedrigem Niveau wie in C, wie Sie gewinnen ein besseres Verständnis von der hardware-Architektur, und wie das alles funktioniert.Lernen Sie alte Windows-API...Ich denke, die Sachen gelassen werden kann, um die Leute bei Microsoft, die lernen müssen, es zu bauen höheren Programmiersprachen und API...Sie Bauten es, lassen Sie Sie leiden mit ihm ;-)

Allerdings, wenn Sie geschehen, finden Sie eine situation, wo Sie das Gefühl kann man einfach nicht tun, was Sie tun müssen, um in einer Sprache auf höherer Ebene (wenige und weit dazwischen), dann können Sie möglicherweise die gefährlichen Tauchgang in die Welt.

ja.werfen Sie einen Blick auf uTorrent, ein erstaunliches Stück software-Effizienz.Die Hälfte seiner geringen Größe ist aufgrund der Tatsache, dass ein Großteil der core-Komponenten wurden neu geschrieben, nicht zu verwenden, gargatuian Bibliotheken.

Vieles davon konnte nicht getan werden, ohne zu verstehen, wie Sie diese Bibliotheken Schnittstelle mit der niedrigeren level-API ' s

Es ist wichtig zu wissen, was verfügbar ist mit der Windows-API.Ich glaube nicht, dass Sie brauchen, Kurbel-code mit es, aber Sie sollten wissen, wie es funktioniert.Die .NET Framework enthält eine Menge von Funktionen, aber es nicht verwalteter code-Entsprechungen für die gesamte Windows-API.Manchmal muss man ein bisschen näher an die Metall, - und zu wissen, was da unten ist, und wie es sich verhält, wird Ihnen ein besseres Verständnis, wie es zu benutzen.

Dies ist wirklich das gleiche wie die Frage, sollte ich lernen, eine low-level-Sprache wie C (oder sogar assembler).

Die Kodierung ist es sicherlich langsamer wird (obwohl natürlich das Ergebnis ist viel schneller), aber seine wahre Vorteil ist, dass Sie einen Einblick in das, was geschieht in der Nähe der system-Ebene statt, als nur Verständnis jemand anderes Metapher für das, was Los ist.

Es kann auch besser sein, wenn die Dinge nicht gut funktionieren, oder schnell genug oder mit der Art von Granularität, die Sie benötigen.(Und dies zumindest einige Unterklassen und superclassing.)

Ich werde es auf diese Weise.Ich weiß nicht, wie die Programmierung der Win32-API.Es kann ein Schmerz im Vergleich zu managed code.ABER ich bin froh, dass ich es wissen, weil ich schreiben Programme, sonst wäre ich nicht in der Lage sein.Ich kann Programme schreiben, die andere Leute nicht können.Plus, es gibt Ihnen mehr Einblick in das, was Ihr verwalteten code hinter den kulissen.

Die Höhe der Wert, den Sie erhalten, lernen die Win32-API (abgesehen von der möglichen Allgemeine Einblicke bekommen Sie vom lernen über, wie die Nüsse und Bolzen der Maschine zusammenpassen) hängt davon ab, was Sie zu erreichen versuchen.Viele der Win32-API wurde umgebrochen, nett .NET-Bibliothek Klassen, aber nicht alle.Wenn zum Beispiel du bist auf der Suche zu tun, einige ernsthafte audio-Programmierung, den Teil des Win32-API wäre ein ausgezeichneter Gegenstand der Studie, da nur die meisten grundlegenden Operationen sind verfügbar .NET-Klassen.Zuletzt habe ich überprüft, sogar die verwalteten DirectX DirectSound Bibliothek war schrecklich.


Auf die Gefahr shameless self-promotion....

Ich kam gerade über eine situation, wo das Win32-API war meine einzige option.Ich möchte die verschiedenen QuickInfos für jedes Element in einem Listenfeld.Ich schrieb auf, wie ich es gemacht habe auf diese Frage.

Auch in sehr sehr hohen Niveau, Sprachen Sie noch über die API.Warum?Also, nicht jeden Aspekt der API repliziert wurde, indem Sie die verschiedenen libraries (Bibliotheken, frameworks, etc.Sie müssen lernen, die API für so lange wie Sie benötigen, die API zu erreichen, was Sie versuchen zu tun.(Und nicht mehr.)

Abgesehen von einigen sehr speziellen Fällen, wenn Sie brauchen direkten Zugriff auf APIs, würde ich NEIN sagen.

Es wird viel Zeit und Mühe erforderlich zu lernen, zu implementieren, die native API-Aufrufe korrekt und der Rückgabe-Wert ist einfach nicht Wert.Ich würde eher zu verbringen Zeit lernen einige neue, heiß-Technologie oder ein framework, dass wird Ihr Leben leichter machen und Programmierung weniger schmerzhaft.Nicht jahrzehntelange veraltete COM-Bibliotheken, die niemand mehr verwendet (sorry für COM-Benutzer).

Bitte nicht steinigt mich für diese Ansicht.Ich weiß, dass viele Ingenieure haben hier wirklich neugierig Seelen und es ist nichts falsch mit dem lernen, wie die Dinge funktionieren.Neugier ist gut und hilft wirklich verstehen.Aber aus einem leitenden Gesichtspunkt, ich würde eher eine Woche lang lernen, wie das entwickeln von Android-apps als, wie nennt OLEs oder COMs.

Wenn Sie planen, zu entwickeln, ist ein cross-Plattform-Anwendung, Wenn Sie verwenden win32, dann Ihre Anwendung kann leicht laufen auf linux mit WINE.Dies führt zu einem stark wartbaren Anwendung.Dies ist eines der Vorteile des Lernens win32.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top