2013-06-27 19 views
30

Yönetilen koddan bir nesneyi IntPtr olarak WinApi işlevine geçirmek istiyorum. Bu nesneyi, yönetilen koddaki geri arama işlevime geri IntPtr olarak iletecektir. Bu bir yapı değil, bir sınıfın örneği.C# - Nasıl IntPtr ve Geri Nesne Dönüştürülür?

object'u IntPtr'a nasıl dönüştürebilirim? Ben WINAPI aracılığıyla benim geri arama işlevi listesini geçirmek istiyorsanız

+2

GCHandle –

cevap

42

yüzden 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 Edit

David Heffernan için kullanın: açıklamalarda belirtildiği gibi, sen serbest gerekiyor Kullandıktan sonra kulp. Ayrıca döküm kullandım. here gibi GCHandle.ToIntPtr(handle1) ve GCHandle.FromIntPtr(parameter) statik methgodlarını kullanmak akıllıca olabilir. Bunu kontrol etmedim.

+1

kullanarak sabitleyin Artık gerekmediğinde, tutamaç [serbest] (https://msdn.microsoft.com/en-us/library/a95009h1 (v = vs.110) .aspx) olmalıdır! Bu kod –

+0

@dario_ramos'un akıcılığını verir. Bir not ekledim. – Bitterblue

İlgili konular