Имеет ли смысл изучать низкоуровневое программирование WinAPI? [закрытый]


имеет ли смысл, имея все c#-managed-bliss, вернуться к окнам программирования Petzold и попытаться создать код с чистым WinAPI?

чему можно научиться у него? Не слишком ли он устарел, чтобы быть полезным?

22 52

22 ответа:

этот вопрос граничит с религиозным :) но я все равно дам свои мысли.

Я вижу ценность в изучении Win32 API. Большинство, если не все, библиотеки GUI (управляемые или неуправляемые) приводят к вызовам Win32 API. Даже самые тщательные библиотеки не покрывают 100% API, и поэтому всегда есть пробелы, которые необходимо затыкать прямыми вызовами API или P/invoking. Некоторые имена оболочек вокруг вызовов API имеют схожие имена с базовыми вызовами API, но эти имена не совсем самодокументированы. Таким образом, понимание базового API и используемой в нем терминологии поможет понять API-интерфейсы оболочки и то, что они на самом деле делают.

кроме того, если вы понимаете природу базовых API, используемых фреймворками, то вы сделаете лучший выбор в отношении того, какие функции библиотеки вы должны использовать в данном сценарии.

Ура!

я придерживался стандарта C/C++ в течение многих лет, прежде чем изучать Win32 API, и, чтобы быть довольно тупым, часть "изучение Win32 API" не является лучшим техническим опытом моей жизни.

в одной руке Win32 API довольно круто. Это как расширение стандартного API C (кому нужно fopen когда вы можете иметь CreateFile. Но я думаю, что UNIX / Linux / WhateverOS имеют те же функции gizmo. Во всяком случае, в Unix/Linux у них есть "все это файл". В Windows у них есть "все есть... Окно "( без шуток! Смотрите CreateWindow!).

С другой стороны, это устаревший API. Вы будете иметь дело с необработанным С и необработанным с безумием.

  • как сказать своей структуре свой собственный размер, чтобы пройти через void * указатель на некоторую функцию Win32.
  • сообщения также могут быть довольно запутанными: смешивание объектов C++ с окнами Win32 приводит к очень интересным примерам курица или яйцо проблема (забавные моменты, когда вы пишете своего рода delete this ; в методе класса).
  • необходимость подкласса WinProc, когда вы более знакомы с наследованием объектов, является разделением головы и менее оптимальным.
  • и конечно, есть радость от "почему в этом мире гидроразрыва они сделали это таким образом ??" моменты, когда вы ударяете по клавиатуре головой слишком много раз и возвращаетесь домой с ключами, выгравированными на лбу, только потому, что кто-то подумал, что логичнее написать API, чтобы включить изменение цвет "окна", не изменяя одно из его свойств, а задавая его родительскому окну.
  • etc.

в последней руке (три руки ???), учтите, что некоторые люди, работающие с устаревшими API, сами используют устаревший стиль кода. В тот момент, когда вы услышите"const это для чайников" или "я не использую пространства имен, потому что они снижают скорость выполнения" или еще лучше "Эй, кому нужно C++? Я кодирую в своем собственном бренде объектно-ориентированного C!!!" (без шуток... В профессиональной среде и результат был довольно зрелищным...), вы будете чувствовать вид страха только осужденный чувствовать себя перед гильотина.

так... В общем, это интересные опыта.

Edit

после перечитывания этого сообщения, я вижу, что это может рассматриваться как чрезмерно отрицательный. Это не.

иногда это интересно (как ну и расстраивает), чтобы знать, как все работает под капотом. Вы поймете это, несмотря на огромные (невозможные?) ограничения, команда Win32 API проделала замечательную работу, чтобы убедиться, что все, от вас "olde Win16 program" до вашего "последнего приложения Win64 over-the-top", может работать вместе, в прошлом, сейчас и в будущем.

вопрос: вы действительно хотите?

потому что тратить недели, чтобы сделать то, что можно было бы сделать (и сделать лучше) в других более высокого уровня и/или объектно-ориентированный API может быть довольно мотивационным (реальный жизненный опыт: 3 недели для Win API, против 4 часов на трех других языках и / или библиотеках).

в любом случае, вы найдете блог Рэймонда Чена очень интересным из-за его взгляда инсайдера как на Win API, так и на его эволюцию на протяжении многих лет:

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

собственные API являются" реальными " API операционной системы. Библиотека .NET-это (за редким исключением) не более чем причудливая оболочка вокруг них. Так что да, я бы сказал, что любой, кто может понять .NET со всей его сложностью, может понять относительно мирские вещи, такие как разговор с API без помощи среднего человека.

просто попробуйте сделать DLL инъекции из управляемого кода. Это невозможно сделать. Вы будете вынуждены написать собственный код для этого, для оконных настроек, для реального подклассы, и дюжина других вещей.

Так что да: вы должны (должны) знать оба.

изменить: даже если вы планируете использовать P / Invoke.

абсолютно. Когда никто не знает низкого уровня, кто будет обновлять и писать языки высокого уровня? Кроме того, когда вы понимаете материал низкого уровня, вы можете писать более эффективный код на языке более высокого уровня, а также отлаживать более эффективно.

исходя из предположения, что вы создаете приложения, предназначенные для Windows:

  • это может быть информативным, чтобы понять более низкие уровни системы - как они работают, как ваш код взаимодействует с ними (даже если только косвенно), и где у вас есть дополнительные опции, которые не доступны в абстракциях более высокого уровня
  • бывают случаи, когда ваш код может быть недостаточно эффективным, высокопроизводительным или точным для ваших требований
  • , в все больше и больше случаев, такие люди, как мы (которые никогда не изучали "неуправляемое кодирование"), смогут снять программирование, которое мы пытаемся сделать без "обучения" Win32.
  • кроме того, есть много сайтов, которые предоставляют рабочие образцы, фрагменты кода и даже полностью функциональный исходный код, который вы можете "использовать" (заимствовать, плагиат-но проверьте, что вы соблюдаете любую лицензию на повторное использование или авторское право!) чтобы заполнить любые пробелы, которые не обрабатываются библиотеками классов .NET framework (или библиотеки, которые можно скачать или лицензии).
  • Если вы можете снять подвиги, которые вам нужны, не возясь в Win32, и вы делаете хорошую работу по разработке хорошо сформированного, читаемого управляемого кода, то я бы сказал, что освоение .NET было бы лучшим выбором, чем распространение себя в двух очень разных средах.
  • Если вам часто приходится использовать те функции Windows, которые не получили хорошего покрытия библиотеки классов Framework, то обязательно изучите навыки, которые вам нужны.
  • Я лично провел слишком много времени, беспокоясь о "других областях" кодирования, что я должно чтобы понять, чтобы производить "хорошие программы", но есть много мазохистов, которые думают, что потребности и желания каждого похожи на их собственные. Несчастье любит компанию. :)

исходя из предположения, что вы создаете приложения для мира "Web 2.0", или это было бы так же полезно / полезно для *NIX & MacOS пользователи:

  • придерживайтесь языков и компиляторов, которые нацелены на как можно больше кросс-платформенных сред.
  • чистый .NET в Visual Studio, очевидно, лучше, чем Win32, но разработка против МОНОБИБЛИОТЕК, возможно, с использованием Sharp Develop IDE, вероятно, еще лучший подход.
  • вы также можете потратить свое время на изучение Java, и эти навыки будут очень хорошо переноситься на программирование на C# (плюс код Java теоретически будет работать на любом платформа с соответствующим JRE). Я слышал, что Java больше похожа на" писать один раз, отлаживать везде", но это, вероятно, так же верно, как (или даже более) C#.

аналогия: если вы строите автомобили для жизни (Программирование), то его очень уместно знать, как работает двигатель (Win32).

простой ответ, да.

Это ответ на любой вопрос, который бы.. "имеет ли смысл изучать язык низкого уровня / api X, даже если есть язык более высокого уровня / api Y"

да

вы можете загрузить свой ПК с Windows (или любую другую ОС) и задать этот вопрос, потому что несколько парней в Microsoft написали 16-битный ассемблерный код, который загружает вашу ОС.

Ваш браузер работает, потому что кто-то написал ядро ОС на C, которая служит запросы вашего браузера.

Это идет вплоть до языков сценариев.

большой или маленький, всегда есть рынок и возможность что-то писать на любом уровне абстракции. Вы просто должны любить его и вписываться в правильную работу.

никакой api / язык на любом уровне абстракции не имеет значения если нет лучшего, конкурирующего на том же уровне.

другой взгляд на это: хороший пример от одного из Майкла Книга Абраша: программисту C была дана задача написать функцию для очистки экрана. Поскольку C был лучшей (более высокого уровня) абстракцией над сборкой и всем остальным, программист знал только C и знал его хорошо. Он сделал все возможное-он переместил курсор в каждое место на экране и очистил символ там. Он оптимизировал петлю и убедился, что она работает так быстро, как только может. Но все равно это было медленно... пока какой-то парень не пришел и не сказал, что есть какая-то инструкция BIOS/VGA или что-то, что может очистить экран мгновенно включился.

Это всегда помогает знать, что вы идете на.

да, по нескольким причинам:

1) .net обертывает код Win32. .net обычно является превосходной системой для кодирования, но наличие некоторых знаний о базовом уровне Win32 (oops, WinAPI теперь, когда есть 64-разрядный код тоже) укрепляет ваши знания о том, что происходит на самом деле.

2) в этой экономике лучше иметь некоторые преимущества перед другим парнем, когда вы ищете работу. Некоторые WinAPI опыт может обеспечить это для вас.

3) Некоторые системы аспекты еще не доступны через .net framework, и если вы хотите получить доступ к этим функциям, вам нужно будет использовать p / invoke (см. http://www.pinvoke.net для некоторой помощи там). Наличие хотя бы небольшого опыта WinAPI сделает ваши усилия по разработке p/invoke намного более эффективными.

4) (добавлено) теперь, когда Win8 был вокруг некоторое время, это еще построен на верхней части WinAPI. iOS, Android, OS/X и Linux все там, но WinAPI все еще будет там в течение многих лет.

изучение нового языка программирования или технологии происходит по одной из трех причин:
1. Нужно: вы начинаете проект по созданию веб-приложения, и вы ничего не знаете о нем ASP.NET
2. Энтузиазм: вы очень взволнованы ASP.NET MVC. почему бы не попробовать?
3. Свободное время: но у кого это вообще есть.

лучшая причина узнать что-то новое-это необходимость. Если вам нужно сделать что-то, что платформа .NET framework не может сделать (например, производительность), то WinAPI-это ваше решение. До тех пор мы будем заняты изучением .NET

для большинства потребностей на рабочем столе Вам не нужно знать Win32, однако есть много Win32 не в .NET, но это в расходных материалах, которые могут оказаться менее 1% вашего приложения.

поддержка USB, поддержка HID, Windows Media Foundation просто с верхней части моей головы. Есть много интересных Vista API, доступных только из Win32.

вы сделаете себе большое одолжение, научившись взаимодействовать с Win32 API, если вы занимаетесь настольным программированием, потому что, когда вам нужно позвонить Win32, и вы это сделаете, вы не будете тратить недели на почесывание головы.

лично мне не очень нравится Win32 API, но есть ценность в его изучении, поскольку API позволит больше контролировать и эффективно использовать графический интерфейс, чем такой язык, как Visual Basic, и я считаю, что если вы собираетесь зарабатывать на жизнь написанием программного обеспечения, вы должны знать API, даже если вы не используете его напрямую. Это по причинам, аналогичным причинам, по которым хорошо изучать C, например, как strcpy занимает больше времени, чем копирование целого числа, или почему вы должны использовать указатели на массивы в качестве функции параметры вместо массивов по значению.

изучение языка C или более низкого уровня, безусловно, может быть полезно. Однако я не вижу очевидного преимущества в использовании неуправляемого WinAPI.

Я видел низкоуровневый код Windows API... это не очень красиво... Жаль, что я не могу разучиться этому. Я думаю, что полезно изучать низкий уровень, как в C, поскольку вы получаете лучшее понимание архитектуры аппаратного обеспечения и того, как все это работает. Изучение старого Windows API... Я думаю, что этот материал можно оставить людям в Microsoft, которым, возможно, потребуется изучить его для создания языков более высокого уровня и API... они построили его, пусть страдают вместе с ним; -)

однако, если вам случится найти ситуацию там, где вы чувствуете, что просто не можете сделать то, что вам нужно сделать на языке более высокого уровня (мало и далеко), тогда, возможно, начните опасное погружение в этот мир.

да. взгляните на uTorrent, удивительную часть эффективности программного обеспечения. Половина его небольшого размера связана с тем, что большая часть его основных компонентов была переписана, чтобы не использовать библиотеки gargatuian.

многое из этого не может быть сделано без понимания того, как эти библиотеки взаимодействуют с API нижнего уровня

важно знать, что доступно с помощью API Windows. Я не думаю, что нужно провернуть код, но вы должны знать, как это работает. Интернет .NET и содержит множество функциональных возможностей, но он не обеспечивает управляемого кода эквиваленты для всего API-интерфейса Windows. Иногда вам нужно немного приблизиться к металлу, и знание того, что там внизу и как оно ведет себя, даст вам лучшее понимание того, как его использовать.

Это действительно то же самое, что и вопрос, Должен ли я изучать язык низкого уровня, такой как C (или даже ассемблер).

Кодирование в нем, конечно, медленнее (хотя, конечно, результат намного быстрее), но его истинное преимущество заключается в том, что вы получаете представление о том, что происходит на близком к системному уровне, а не просто понимание чужой метафоры для того, что происходит.

Он также может быть лучше, когда вещи не работают хорошо, или достаточно быстро, или то детализация, которая вам нужна. (И сделать хотя бы некоторые подклассы и суперклассы.)

Я скажу это так. Мне не нравится программирование на Win32 API. Это может быть боль по сравнению с управляемым кодом. Но я рад, что знаю это, потому что я могу писать программы, которые иначе я бы не смог. Я могу писать программы, которые другие люди не могут. Плюс это дает вам больше понимания того, что управляемый код делает за кулисами.

количество значения, которое вы получаете от изучения Win32 API, (помимо видов общих идей, которые вы получаете от изучения того, как гайки и болты машины подходят друг к другу), зависит от того, чего вы пытаетесь достичь. Многие Win32 API были красиво обернуты в классы библиотек .NET, но не все из них. Если, например, вы хотите сделать какое-то серьезное аудио Программирование, эта часть Win32 API будет отличным предметом изучения, потому что только самые основные из них операции доступны из классов .NET. В последний раз я проверил, что даже управляемая библиотека DirectX DirectSound была ужасной.


с риском бесстыдного саморекламы....

Я только что столкнулся с ситуацией, когда Win32 API был моим единственным вариантом. Я хочу иметь разные подсказки для каждого элемента в списке. Я написал как я это сделал этот вопрос.

даже в языках очень высокого уровня вы все еще используете API. Зачем? Ну, не каждый аспект API был реплицирован различными библиотеками, фреймворками и т. д. Вам нужно изучить API до тех пор, пока вам понадобится API для выполнения того, что вы пытаетесь сделать. (И больше нет.)

кроме некоторых очень особых случаев, когда вам нужен прямой доступ к API, я бы сказал, Нет.

требуется значительное время и усилия, чтобы научиться правильно реализовывать собственные вызовы API, и возвращаемое значение просто не стоит. Я бы предпочел потратить время на изучение некоторых новых горячих технологий или рамок, которые сделают вашу жизнь проще и программирование менее болезненным. Не десятилетние устаревшие библиотеки COM, которые никто больше не использует (извините за COM пользователи.)

пожалуйста, не побивайте меня камнями за этот вид. Я знаю, что у многих инженеров здесь действительно любопытные души, и нет ничего плохого в том, чтобы узнать, как все работает. Любопытство-это хорошо и действительно помогает пониманию. Но с управленческой точки зрения я бы предпочел провести неделю, изучая, как разрабатывать приложения для Android, чем как звонить OLEs или COMs.

Если вы планируете разработать кросс-платформенное приложение, Если вы используете win32, то ваше приложение может легко работать на linux через WINE. Это приводит к в сильно ремонтопригодном применении. Это одно из преимуществ обучения win32.