Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
24
Help us understand the problem. What is going on with this article?
@kob58im

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

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

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()]には気を付けよう。

24
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
kob58im
趣味でC#で色々試してます。 置いてるほとんどのC#サンプルコードは、Windows7以降デフォで入ってる環境でコンパイルできます。 最近はCodePen使ってJavaScriptも書いてます。

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
24
Help us understand the problem. What is going on with this article?