Pertanyaan C # - Bagaimana Mengkonversi Objek Ke IntPtr Dan Kembali?


Saya ingin mengirimkan objek dari kode yang dikelola ke fungsi WinApi sebagai IntPtr. Ini akan meneruskan objek ini kembali ke fungsi panggil balik saya dalam kode yang dikelola sebagai IntPtr. Ini bukan struktur, ini adalah instance dari kelas.

Bagaimana cara saya mengonversi object untuk IntPtr dan kembali ?


32
2018-06-27 09:48


asal


Jawaban:


Jadi jika saya ingin memberikan daftar ke fungsi callback saya melalui WinApi yang saya gunakan 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: Seperti yang tercantum di komentar, Anda perlu membebaskan pegangan setelah digunakan. Juga saya menggunakan casting. Mungkin bijaksana untuk menggunakan metode statis GCHandle.ToIntPtr(handle1) dan GCHandle.FromIntPtr(parameter) seperti sini. Saya belum memverifikasi itu.


45
2018-06-27 10:12