2013-06-27 40 views
30

Tôi muốn chuyển đối tượng từ mã được quản lý tới hàm WinApi dưới dạng IntPtr. Nó sẽ chuyển đối tượng này về hàm gọi lại của tôi trong mã được quản lý dưới dạng IntPtr. Nó không phải là một cấu trúc, nó là một thể hiện của một lớp.C# - Làm thế nào để chuyển đổi đối tượng thành IntPtr và quay lại?

Làm cách nào để chuyển đổi object thành IntPtr và ngược lại?

+2

Ghim nó bằng GCHandle –

Trả lời

42

Vì vậy, nếu tôi muốn thông qua một danh sách đến hàm callback của tôi thông qua WINAPI tôi sử dụng 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

Edit: Như đã đề cập trong các ý kiến, bạn cần phải giải phóng tay cầm sau khi sử dụng. Ngoài ra tôi đã sử dụng đúc. Có thể sử dụng các phương pháp đo lường tĩnh là GCHandle.ToIntPtr(handle1)GCHandle.FromIntPtr(parameter) như here. Tôi chưa kiểm tra điều đó.

+1

Tay cầm phải được [giải phóng] (https://msdn.microsoft.com/en-us/library/a95009h1 (v = vs.110) .aspx) khi không còn cần thiết nữa! Mã này bị rò rỉ –

+0

@dario_ramos Làm cho tinh thần. Tôi đã thêm một ghi chú. – Bitterblue

Các vấn đề liên quan