マネージ コードから WinApi 関数に としてオブジェクトを渡しますIntPtr
。このオブジェクトは、マネージ コードのコールバック関数に として返されますIntPtr
。これは構造体ではなく、クラスのインスタンスです。
object
に変換したり元に戻したりするにはどうすればいいですかIntPtr
?
ベストアンサー1
WinApiを介してコールバック関数にリストを渡したい場合は、次のようにします。GCHandle
// object to IntPtr (before calling WinApi):
List<string> list1 = new List<string>();
GCHandle handle1 = GCHandle.Alloc(list1);
IntPtr parameter = (IntPtr) handle1;
// call WinAPi and pass the parameter here
// then free the handle when not needed:
handle1.Free();
// back to object (in callback function):
GCHandle handle2 = (GCHandle) parameter;
List<string> list2 = (handle2.Target as List<string>);
list2.Add("hello world");
ありがとうデビッド・ヘファーナン
編集:コメントにもあるように、使用後はハンドルを解放する必要があります。また、キャストも使用しました。静的メソッドを使用するのが賢明かもしれませんGCHandle.ToIntPtr(handle1)
。GCHandle.FromIntPtr(parameter)
ここ。それは確認していません。