C# - オブジェクトを IntPtr に変換する方法と、その逆の方法を教えてください。質問する

C# - オブジェクトを IntPtr に変換する方法と、その逆の方法を教えてください。質問する

マネージ コードから 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)ここ。それは確認していません。

おすすめ記事