25
41

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

C#からWindows API(Win32API)を使いたいときに参考になるサイト集

Last updated at Posted at 2019-09-18

自分はあまり深くは理解できていないが、良さそうなとこを挙げてみる。

APIを探す

(やりたいことからAPI名を調べる場合は、ググったほうがはやい。)

APIを探す - SendMessageまわり

API定義のC#での書き方

API名が判明している前提。

  • PInvoke
    公式からも参照されている。Dll名やAPI名が分かっていればここから探せる。

  • NativeMethods.cs - Microsoft
    internal classなので直接呼び出しはできないが、定義コードは参考になる。
    .Netの基本機能のなかで使われているものだけが定義されているようで、網羅はされていないので注意(例えばSendMessageがない)。

    ちゃんと理解できていない(HandleRefのあたりとかがよくわからない)ので一旦削除します。
    ・・・HandleRefこの辺 公式 によるとGC対策っぽいけど型のサイズが合ってないような。。。
    ⇒型の扱いについては特殊なルールが適用されているよう

なお、SendMessageIntPtr型のパラメータをintで書いているようなサイトのコードは64bit環境を考慮していないので、そのままでは使わないほうがよい。(msgパラメータはuint(もしくはint)だが)

属性の指定

属性([return: MarshalAs(UnmanagedType.Bool)]みたいなの)のつけかた。

型の読み替え

.Net(C#)とWin32API(C言語)の型の対応関係

値の読み替え

C言語のNULLは、C#のIntPtr.Zero

構造体の扱い

よく使う属性指定:[StructLayout(LayoutKind.Sequential)]

構造体内の固定長配列の扱い

よく使う属性指定:
[MarshalAs(UnmanagedType.ByValTStr,SizeConst=要素数)]
[MarshalAs(UnmanagedType.ByValArray,SizeConst=要素数)]

共用体の扱い

Cのunion, C#の[FieldOffset()]には気を付けよう。

25
41
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
25
41

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?