オブジェクトをマネージコードからWinApi関数にIntPtr
として渡したいとします。このオブジェクトをマネージコードのコールバック関数IntPtr
に戻します。それは構造体ではなく、クラスのインスタンスです。C# - オブジェクトをIntPtrに変換して戻す方法
object
をIntPtr
に変換して戻すにはどうすればよいですか?
オブジェクトをマネージコードからWinApi関数にIntPtr
として渡したいとします。このオブジェクトをマネージコードのコールバック関数IntPtr
に戻します。それは構造体ではなく、クラスのインスタンスです。C# - オブジェクトをIntPtrに変換して戻す方法
object
をIntPtr
に変換して戻すにはどうすればよいですか?
私は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");
Thxを編集
David Heffernanに使用します。コメントで述べたように、あなたが解放する必要が使用後のハンドル。また、私は鋳造を使用しました。静的メソッドGCHandle.ToIntPtr(handle1)
とGCHandle.FromIntPtr(parameter)
をhereのように使用することが賢明かもしれません。私はそれをチェックしていない。
不要になったときにハンドルを[解放](https://msdn.microsoft.com/en-us/library/a95009h1(v = vs.110).aspx)する必要があります。このコードの漏洩 –
@dario_ramos意味があります。私はメモを付け加えた。 – Bitterblue
GCHandleを使用して固定 –