2013-06-27 16 views
30

Chcę przekazać obiekt z kodu zarządzanego do funkcji WinApi jako IntPtr. Przekaże ten obiekt z powrotem do mojej funkcji wywołania zwrotnego w zarządzanym kodzie jako IntPtr. To nie jest struktura, to instancja klasy.C# - Jak konwertować obiekt na IntPtr iz powrotem?

Jak przekonwertować object na IntPtr iz powrotem?

+2

Przypnij za pomocą GCHandle –

Odpowiedz

42

Więc jeśli chcę przekazać listę do mojej funkcji wywołania zwrotnego poprzez WinAPI używam 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 do David Heffernan

EDIT: Jak zauważył w komentarzach, trzeba uwolnić uchwyt po użyciu. Również używałem odlewania. Rozsądne może być użycie statycznego metgods GCHandle.ToIntPtr(handle1) i GCHandle.FromIntPtr(parameter), takich jak here. Nie sprawdziłem tego.

+1

Uchwyt musi być [zwolniony] (https://msdn.microsoft.com/en-us/library/a95009h1 (v = vs.110) .aspx), gdy nie jest już potrzebny! Ten kod wycieka –

+0

@dario_ramos Ma sens. Dodałem notatkę. – Bitterblue

Powiązane problemy