stakx は彼のコメントで何かに取り組んでいます:
明らかな出発点は、そのコード行の元のソースを調査することでした。どこからコピペしたの?NativeMethods.SetParent
元のソースでの宣言を見つけることができますか? (答える必要はありません。これは、この場合に私が何をしたかを示唆するものです。)
これは、まさにそのような問題を解決するために必要な方法です。
質問に示されているコード スニペットは、実際には here からコピーされました。いいえ、コピーしてプロジェクトに貼り付けてもコンパイルされません。Stack Overflow はコード作成サービスではありません。完全なデモを書き込もうとしているわけではありませんが、必要なコードを自分で書いた場合にどのようになるかを簡単に示します。
明るい灰色の背景の部分だけでなく、回答全体を読む必要があります。私たちは皆プログラマーなので、コードを見ただけですべてを理解できると考えがちですが、それは残念な嘘です。関数の Windows SDK ドキュメントへのリンクSetParent
を提供しました。そのドキュメントを読み、関数の機能を理解してから、C# コードから呼び出せるように P/Invoke 宣言を記述する必要があります。
Kendall が言うように、ネイティブ Win32 関数の呼び出しは、NativeMethods
慣例と .NET 設計ガイドラインからの明示的な推奨 (StyleCop などのツールによって強制される) の両方によって、 という静的クラスに配置されます。Win32 相互運用に関心のある .NET 開発者はこの規則に精通しており、P/Invoke 定義を作成するときにそれに従うと想定していたため、私のサンプルはこの一般的な方法に従っていました。
Nate がほのめかしているように、Win32 関数の P/Invoke 定義を記述する際に、Web サイトhttp://pinvoke.net/が役立つリソースであると考える人もいます。そして、そうなることがよくあります。ただし、そこからコードをコピーして貼り付けるだけではないことも確認する必要があります。私は彼らが提供するサンプルに驚くほど多くの間違いを見てきました (そして、そのウェブサイトからコピーした間違ったコードを使用したときにアプリが爆発した人々からのスタック オーバーフローの質問のかなりの割合以上に答えました)。使用しているコードが何をしているのか、どのように動作するのかを理解する必要があります。これにより、含まれている可能性のある間違いを確実に見つけることができるだけでなく、アプリケーションに深刻なバグやさらに悪いことにセキュリティ ホールを持ち込むことを防ぐこともできます。