2013-06-27 27 views
30

オブジェクトをマネージコードからWinApi関数にIntPtrとして渡したいとします。このオブジェクトをマネージコードのコールバック関数IntPtrに戻します。それは構造体ではなく、クラスのインスタンスです。C# - オブジェクトをIntPtrに変換して戻す方法

objectIntPtrに変換して戻すにはどうすればよいですか?

+2

GCHandleを使用して固定 –

答えて

42

私は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のように使用することが賢明かもしれません。私はそれをチェックしていない。

+1

不要になったときにハンドルを[解放](https://msdn.microsoft.com/en-us/library/a95009h1(v = vs.110).aspx)する必要があります。このコードの漏洩 –

+0

@dario_ramos意味があります。私はメモを付け加えた。 – Bitterblue

関連する問題