55

C#で管理された至福のすべてを持っているので、Petzoldのプログラミングウィンドウに戻って、純粋なWinAPIを使用してコードを作成しようとするのは理にかなっていますか?

それから何を学ぶことができますか?古すぎて役に立たないのではないですか?

4

22 に答える 22

65

この質問は宗教に接しています:)しかし、とにかく私の考えを述べます。

私は、Win32 API を学ぶことに価値があると考えています。すべてではないにしても、ほとんどの GUI ライブラリ (マネージまたはアンマネージ) は、Win32 API の呼び出しになります。最も完全なライブラリでさえ、API を 100% カバーしているわけではないため、直接の API 呼び出しまたは P/invoking によって埋める必要のあるギャップが常に存在します。API 呼び出しのラッパーの名前の中には、基になる API 呼び出しと似た名前のものがありますが、それらの名前は正確に自己文書化されているわけではありません。したがって、基礎となる API とそこで使用される用語を理解することは、ラッパー API とその実際の機能を理解するのに役立ちます。

さらに、フレームワークで使用される基礎となる API の性質を理解していれば、特定のシナリオで使用する必要があるライブラリ機能に関して、より適切な選択を行うことができます。

乾杯!

于 2008-08-08T01:00:49.203 に答える
23

私は Win32 API を学ぶ前に何年もの間、標準の C/C++ を使い続けていました。率直に言って、「Win32 API を学ぶ」部分は私の人生で最高の技術的経験ではありません。

一方では、Win32 API は非常に優れています。それは C 標準 API の拡張のようなものfopenです( CreateFile. 、彼らは「すべてが...ウィンドウ」を持っています(冗談ではありません!参照してくださいCreateWindow!)。

一方、これはレガシー API です。生の C と生の C の狂気を扱うことになります。

  • void *Win32 関数へのポインターを通過するように、構造体に独自のサイズを伝えるようなものです。
  • メッセージングも非常に混乱する可能性があります。C++ オブジェクトと Win32 ウィンドウを混在させると、ニワトリが先か卵delete this ;が先かという問題の非常に興味深い例につながります (ある種のin クラス メソッドを記述するときの面白い瞬間)。
  • オブジェクトの継承に慣れている場合に、WinProc をサブクラス化する必要があるのは頭が混乱し、最適とは言えません。
  • そしてもちろん、「なぜこのフラッキングの世界でこんなことをしたの??」という喜びもあります。プロパティの1つを変更するのではなく、親ウィンドウに要求することによって、「ウィンドウ」の色を変更できるようにするAPIを作成する方が論理的だと考えました。

最後のハンド ( 3 つのハンド ??? ) では、レガシー API を使用している一部の人々が、レガシー コード スタイルを使用していることを考慮してください。「constダミー用です」または「ランタイム速度が低下するため、名前空間は使用しません」、またはさらに良い「ねえ、C ++が必要な人はいますか? 私は独自のブランドのオブジェクト指向 C でコーディングしています!!! 」 (冗談じゃない…プロの環境で、結果はかなりの光景だった…)、ギロチンの前で感じるような恐怖だけを感じるでしょう.

だから... 全体として、それは興味深い経験です。

編集

この投稿を再読した後、過度に否定的であると見なされる可能性があることがわかりました. そうではない。

物事が内部でどのように機能するかを知ることは、時には興味深い (そしてイライラする) こともあります。莫大な (不可能な?) 制約にもかかわらず、Win32 API チームは、「古い Win16 プログラム」から「最後の Win64 オーバーザトップ アプリケーション」まで、すべてが確実に連携できるように素晴らしい作業を行ったことを理解するでしょう。過去、現在、そして未来に。

問題は、本当にそうしたいですか?

他のより高レベルの API やオブジェクト指向 API で実行できる (そしてより適切に実行できる) ことを行うために数週間を費やすことは、非常にやる気をなくす可能性があるためです (実際の経験: Win API では 3 週間、3 週間で 4 時間)他の言語および/またはライブラリ)。

いずれにせよ、Raymond Chen のブログは、Win API とその長年にわたる進化に関する内部関係者の見解により、非常に興味深いものになるでしょう。

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

于 2008-09-19T18:37:48.753 に答える
16

絶対。誰も低レベル言語を知らないとき、誰が高レベル言語を更新して書くのでしょうか? また、低レベルのものを理解すると、より高レベルの言語でより効率的なコードを記述でき、より効率的にデバッグすることもできます。

于 2008-08-08T00:31:04.660 に答える
16

ネイティブ API は、「実際の」オペレーティング システム API です。.NET ライブラリは (いくつかの例外を除いて) それらを包む派手なラッパーにすぎません。そうです、複雑な .NET を理解できる人なら誰でも、API との対話などの比較的平凡なことを仲介者の利益なしで理解できると言えます。

マネージド コードから DLL インジェクションを実行してみてください。それはできません。このため、ウィンドウの微調整、実際のサブクラス化、およびその他多数のネイティブ コードを作成する必要があります。

はい、両方を知っておく必要があります。

編集: P/Invoke を使用する予定がある場合でも。

于 2008-08-08T00:53:24.663 に答える
11

Windows を対象としたアプリを構築していると仮定すると、次のようになります。

  • システムの下位レベルを理解することは確かに有益です-それらがどのように機能するか、コードがそれらとどのように相互作用するか(間接的であっても)、上位レベルの抽象化では利用できない追加オプションがある場所
  • コードが要件に対して十分に効率的、高性能、または正確でない場合があります。
  • しかし、ますます多くの場合、私たちのような人々 (「アンマネージ コーディング」を学んだことのない人) は、Win32 を「学ばなくても」実行しようとしているプログラミングを実行できるようになります。
  • さらに、実用的なサンプル、コードの断片、さらには完全に機能するソース コードを提供するサイトがたくさんあります。それらを「活用」 (借りたり、盗用したりします。ただし、再利用ライセンスや著作権に準拠していることを確認してください) してください。 .NET フレームワーク クラス ライブラリ (または、ダウンロードまたはライセンスを取得できるライブラリ) によって処理されないギャップで。
  • Win32 をいじらずに必要な偉業を成し遂げることができ、整形式で読み取り可能なマネージ コードをうまく開発しているのであれば、.NET をマスターすることは、自分自身を薄く広げるよりも良い選択だと思います。 2 つの非常に異なる環境で。
  • フレームワークのクラス ライブラリが十分にカバーされていない Windows の機能を頻繁に利用する必要がある場合は、必要なスキルを習得してください。
  • 私は個人的に、「良いプログラム」を作成するために理解しなければならないコーディングの「その他の領域」について心配することにあまりにも多くの時間を費やしてきましたが、世の中には、すべての人のニーズや欲求が自分のものと同じであると考えるマゾヒストがたくさんいます。ミザリーは会社が大好きです。:)

「Web 2.0」の世界向けのアプリを構築している、またはそれが *NIX および MacOS ユーザーにとって同様に有用/有益であると仮定して:

  • 可能な限り多くのクロスプラットフォーム環境を対象とする言語とコンパイラを使用してください。
  • Visual Studio の純粋な .NET は明らかに Win32 よりも優れていますが、おそらく Sharp Develop IDE を使用して MONO ライブラリに対して開発する方が、おそらくさらに優れたアプローチです。
  • また、Java の学習に時間を費やすこともできます。そのスキルは C# プログラミングに非常にうまく適用されます (さらに、Java コードは、理論的には、対応する JRE を備えた任意のプラットフォームで実行されます)。Java は「一度書けばどこでもデバッグ」に似ていると言われているのを聞いたことがありますが、それはおそらく C# と同じくらい (またはそれ以上) 真実です。
于 2008-08-09T20:27:00.980 に答える
9

類推: 生活のために車を作る場合 (プログラミング)、エンジンがどのように機能するか (Win32) を知ることは非常に重要です。

于 2008-08-08T01:01:44.457 に答える
8

簡単な答えです。はい。

于 2008-08-08T01:16:26.580 に答える
8

これは、次のような質問に対する答えです。「高レベルの言語/api Y が存在する場合でも、低レベルの言語/api X を学習することは理にかなっていますか?」

はい

Windows PC (またはその他の OS) を起動し、SO でこの質問をすることができます。これは、Microsoft の何人かが、OS をロードする 16 ビット アセンブリ コードを作成したためです。

あなたのブラウザーが動作するのは、ブラウザーのすべての要求を処理する OS カーネルが C で書かれているからです。

それはスクリプト言語にまで及びます。

大小を問わず、あらゆるレベルの抽象化で何かを書く市場と機会が常に存在します。あなたはそれが好きで、適切な仕事に適合する必要があります。

同じレベルで競合するより優れたものがない限り、抽象化のどのレベルの API や言語も無関係ではありません。

別の見方をすると、Michael Abrash の著書の 1 つからの良い例です。AC プログラマーは、画面をクリアする関数を作成するタスクを与えられました。C はアセンブリなどよりも優れた (高レベルの) 抽象化であったため、プログラマーは C しか知らず、よく知っていました。彼は最善を尽くしました-彼はカーソルを画面上の各場所に移動し、そこでキャラクターをクリアしました。彼はループを最適化し、可能な限り高速に実行されるようにしました。しかし、それでも遅かった... 誰かが入ってきて、BIOS/VGA 命令か、画面を即座にクリアできる何かがあると言うまで.

自分が何を歩いているかを知ることは常に役に立ちます。

于 2010-05-29T03:17:49.137 に答える
7

はい、いくつかの理由から:

1) .net は Win32 コードをラップします。.net は通常、コードに対して優れたシステムですが、基礎となる Win32 レイヤー (おっと、64 ビット コードも存在するようになった今では WinAPI) についてある程度の知識があれば、実際に何が起こっているのかについての知識が強化されます。

2) この経済状況では、仕事を探すときは、他の人より有利な立場に立つ方がよい. 一部の WinAPI の経験により、これが提供される場合があります。

3) .net フレームワークではまだ一部のシステム機能を利用できません。これらの機能にアクセスするには、p/invoke を使用する必要があります (ヘルプについては、 http: //www.pinvoke.net を参照してください)。WinAPI の経験が少しでもあれば、p/invoke の開発作業がより効率的になります。

4) (追加) Win8 が登場してしばらく経った今でも、WinAPI の上に構築されています。iOS、Android、OS/X、および Linux はすべて存在しますが、WinAPI は何年もの間存在し続けるでしょう。

于 2009-07-17T06:17:04.070 に答える
4

新しいプログラミング言語またはテクノロジを学習する理由は、次の 3 つのうちのいずれか
です
。 ASP.NET MVC。それを試してみませんか?
3. 自由時間: でも、そんな時間は誰にもありません。

何か新しいことを学ぶ一番の理由は必要です。.NET フレームワークではできないこと (パフォーマンスなど) を行う必要がある場合は、WinAPI がソリューションです。それまでは、.NET について学ぶことに専念します

于 2008-08-08T01:56:33.723 に答える
4

デスクトップでのほとんどのニーズでは、Win32 を知る必要はありませんが、.NET にはない Win32 がたくさんありますが、アプリケーションの 1% 未満になる可能性がある費用がかかります。

USB のサポート、HID のサポート、Windows Media Foundation は頭の片隅にあるものです。Win32 からのみ利用できる優れた Vista API が多数あります。

デスクトップ プログラミングを行う場合、Win32 API との相互運用を行う方法を学ぶことで、自分自身に大きな恩恵をもたらすでしょう。なぜなら、Win32 を呼び出す必要があるときに、何週間も頭を悩ませる必要がないからです。

于 2008-08-08T16:53:50.550 に答える
4

個人的には Win32 API はあまり好きではありませんが、API を使用すると、Visual Basic のような言語よりも GUI を使用してより多くの制御と効率が可能になるため、それを学ぶことには価値があります。直接使用しない場合でも、API を知っておく必要があります。これは、整数をコピーするよりも strcpy の方が時間がかかる、または値による配列ではなく関数パラメーターとして配列へのポインターを使用する必要があるなど、C を学ぶのが良い理由と同様の理由によるものです。

于 2008-08-21T13:07:30.423 に答える
3

はい。ソフトウェアの効率の驚くべき部分であるuTorrentを見てください。サイズが小さいのは、コアコンポーネントの多くがガルガチュアンライブラリを使用しないように書き直されたためです。

これらのライブラリが低レベルのAPIとどのようにインターフェースするかを理解しなければ、これの多くを行うことはできませんでした。

于 2009-06-11T03:53:11.667 に答える
3

C または低レベルの言語を学ぶことは、間違いなく役に立ちます。ただし、アンマネージ WinAPI を使用する明らかな利点はありません。

于 2008-08-08T00:35:21.720 に答える
3

低レベルの Windows API コードを見たことがあります...きれいではありません...それを忘れることができればいいのにと思います。ハードウェアのアーキテクチャとそのすべての仕組みをよりよく理解できるようになるので、C のように低レベルを学ぶことにはメリットがあると思います。古い W​​indows API を学習しています... 高レベルの言語と API を構築するためにそれを学ぶ必要があるかもしれない Microsoft の人々に任せることができると思います...彼らはそれを構築し、それに苦しんでもらいました ;-)

しかし、高水準言語で必要なことを実行できないと感じる状況をたまたま見つけた場合 (ほとんどない)、おそらくその世界に危険なダイビングを開始してください。

于 2008-08-08T00:40:05.453 に答える
2

Windows API で何が利用できるかを知ることは重要です。それを使ってコードを作成する必要はないと思いますが、それがどのように機能するかを知っておく必要があります。.NET Framework には多くの機能が含まれていますが、Windows API 全体に相当するマネージ コードは提供されていません。時には、金属に少し近づく必要があります。そこに何があり、どのように動作するかを知ることで、使用方法をよりよく理解できます.

于 2008-08-08T02:21:47.853 に答える
2

API に直接アクセスする必要があるいくつかの非常に特殊なケースを除けば、私はノーと言います。

ネイティブ API 呼び出しを正しく実装することを学ぶにはかなりの時間と労力が必要であり、戻り値はそれだけの価値がありません。私はむしろ、あなたの生活を楽にし、プログラミングの苦痛を軽減する新しいホットなテクノロジーやフレームワークを学ぶことに時間を費やしたい. もう誰も実際に使用していない数十年前の時代遅れの COM ライブラリではありません (COM ユーザーには申し訳ありません)。

このビューのために私を石にしないでください。ここの多くのエンジニアは本当に好奇心旺盛で、物事がどのように機能するかを学ぶことに何の問題もありません。好奇心は良いものであり、理解するのに本当に役立ちます。しかし、管理上の観点からは、OLE や COM を呼び出す方法よりも、Android アプリの開発方法を学ぶことに 1 週​​間を費やしたいと考えています。

于 2012-04-23T16:39:30.740 に答える
2

このように言います。Win32 API へのプログラミングは好きではありません。マネージ コードと比較すると、面倒な場合があります。しかし、そうでなければできないプログラムを書くことができるので、それを知ってよかったです。私は他の人ができないプログラムを書くことができます。さらに、マネージ コードが舞台裏で何をしているかについて、より多くの洞察を得ることができます。

于 2008-09-26T02:01:45.877 に答える
2

Win32 API を学習することで得られる価値の量は (マシンの基本要素がどのように組み合わされるかについて学習することで得られる一般的な洞察は別として)、何を達成しようとしているのかによって異なります。Win32 API の多くは .NET ライブラリ クラスに適切にラップされていますが、すべてではありません。たとえば、本格的なオーディオ プログラミングを行う場合、.NET クラスからは最も基本的な操作しか利用できないため、Win32 API のその部分は優れた研究対象となります。最後に、管理された DirectX DirectSound ライブラリでさえひどいものであることを確認しました。


恥知らずな自己宣伝の危険を冒して....

Win32 API が唯一の選択肢である状況に遭遇しました。リストボックス内の各アイテムに異なるツールチップを表示したいと考えています。私はこの質問でそれをどのように行ったかを書きました。

于 2008-09-26T03:01:20.087 に答える
2

非常に高度な言語であっても、API を利用します。なんで?API のすべての側面がさまざまなライブラリやフレームワークなどによって複製されているわけではありません。やろうとしていることを達成するために API が必要である限り、API を学ぶ必要があります。(そしてもうありません。)

于 2009-06-28T18:49:44.737 に答える
2

これは本当に質問と同じです。C のような低レベル言語 (またはアセンブラー) を学ぶ必要があります。

コーディングは確かに遅くなりますが (もちろん、結果ははるかに高速です)、真の利点は、何が起こっているかについて他人の比喩を理解するだけでなく、システム レベルに近いところで何が起こっているかについての洞察を得られることです。 .

また、物事がうまくいかない場合、または十分に速くない場合や、必要な粒度でうまくいかない場合にも、より良い場合があります。(そして、少なくともいくつかのサブクラス化とスーパークラス化を行います。)

于 2008-09-12T06:20:26.567 に答える
1

クロス プラットフォーム アプリケーションの開発を計画している場合、win32 を使用している場合、アプリケーションは WINE を介して Linux で簡単に実行できます。これにより、保守性の高いアプリケーションが実現します。これは、win32 を学習する利点の 1 つです。

于 2009-06-28T18:59:47.883 に答える