==C# Win32 API および DLL の利用==
[[C#][Visual Studio]]{{category Win32API}}
このページからメモ
*http://msdn.microsoft.com/en-us/magazine/cc301501.aspx
*C# では、DLLImportを利用して、コンパイラにどこにラッパー関数とバンドルするエントリーポイントが存在するのかを伝える
*例ではWin32としているが、クラス名は任意であり、ネームスペースに置くことも可能
<<blockquote>>ライブラリとして作成しておけば、任意の C# プロジェクトから利用可能<</blockquote>>
====LPTSTRに対応する====
*入力パラメータとしては、上記のようにstringを使用できるが、出力パラメータとしてこれは使用できない(GetWindowTextで試してみるとよい)。
*なぜなら string は 変更不可(インミュータブル)だから。
<<blockquote>>出力パラメータとして LPTSTR を使用する場合、StringBuilder を利用する<</blockquote>>
=====例(GetWindowText)=====
[[File:0294_get_window_text01.jpg]]
<<blockquote>>StringBuilderのデフォルトのマーシャリング型も LPTSTR だが、GetWindowsText は内容を変更できる<</blockquote>>
====フォルトのマーシャリング型が希望の型でない場合====
[[File:0293_get_window_rect01.jpg]]
<<blockquote>>ref を使うとCLRは、関数がオブジェクトを変更できるように参照として渡す(無名のスタックコピーではなく)。<</blockquote>>
====クラスを構造体として渡す====
*EnumWindows においては、lparam で渡したポインターをコールバック関数で得ることができた。
*.Netでは、IntPtr 、GCHandle を使ってラップする。
<<blockquote>>Free メソッドを呼び出すのを忘れないこと! C#では、時々自分でメモリを開放しなければならない!<</blockquote>>
=====ラッパークラス側=====
using System.Runtime.InteropServices;