I want to pass an object from managed code to a WinApi function as IntPtr
. It will pass this object back to my callback function in managed code as IntPtr
. It's not a structure, it's an instance of a class.
How do I convert object
to IntPtr
and back ?
So if I want to pass a list to my callback function through WinApi I use 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 to David Heffernan
Edit: As noted in the comments, you need to free the handle after use. Also I used casting. It might be wise to use the static methods GCHandle.ToIntPtr(handle1)
and GCHandle.FromIntPtr(parameter)
like here. I haven't verified that.