| ページ一覧 | ブログ | twitter |  書式 | 書式(表) |

MyMemoWiki

差分

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

案内メニュー