我想将对象从托管代码传递给IntPtr
到WinApi函数。它将把该对象作为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)可能是明智的。我还没有验证。关于c# - C#-如何将对象转换为IntPtr并返回?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17339928/