Mercurial > hg > ucis.core
annotate Util/InteropUtil.cs @ 81:3352f89cf6f5
FBGUI ContainerControl fixes (client area, keyboard capture)
author | Ivo Smits <Ivo@UCIS.nl> |
---|---|
date | Sun, 23 Feb 2014 16:56:42 +0100 |
parents | b05350c24596 |
children |
rev | line source |
---|---|
76
b05350c24596
Added InteropUtil for safe pinned array and string access
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
1 ???using System; |
b05350c24596
Added InteropUtil for safe pinned array and string access
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
2 using System.Collections.Generic; |
b05350c24596
Added InteropUtil for safe pinned array and string access
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
3 using System.Text; |
b05350c24596
Added InteropUtil for safe pinned array and string access
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
4 using System.IO; |
b05350c24596
Added InteropUtil for safe pinned array and string access
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
5 using System.Runtime.InteropServices; |
b05350c24596
Added InteropUtil for safe pinned array and string access
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
6 |
b05350c24596
Added InteropUtil for safe pinned array and string access
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
7 namespace UCIS.Util { |
b05350c24596
Added InteropUtil for safe pinned array and string access
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
8 public class PinnedObject : SafeHandle { |
b05350c24596
Added InteropUtil for safe pinned array and string access
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
9 GCHandle gch; |
b05350c24596
Added InteropUtil for safe pinned array and string access
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
10 public PinnedObject(Object obj) |
b05350c24596
Added InteropUtil for safe pinned array and string access
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
11 : base(IntPtr.Zero, true) { |
b05350c24596
Added InteropUtil for safe pinned array and string access
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
12 gch = GCHandle.Alloc(obj, GCHandleType.Pinned); |
b05350c24596
Added InteropUtil for safe pinned array and string access
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
13 SetHandle(gch.AddrOfPinnedObject()); |
b05350c24596
Added InteropUtil for safe pinned array and string access
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
14 } |
b05350c24596
Added InteropUtil for safe pinned array and string access
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
15 public override bool IsInvalid { get { return handle == IntPtr.Zero; } } |
b05350c24596
Added InteropUtil for safe pinned array and string access
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
16 protected override bool ReleaseHandle() { |
b05350c24596
Added InteropUtil for safe pinned array and string access
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
17 if (gch.IsAllocated) { |
b05350c24596
Added InteropUtil for safe pinned array and string access
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
18 gch.Free(); |
b05350c24596
Added InteropUtil for safe pinned array and string access
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
19 return true; |
b05350c24596
Added InteropUtil for safe pinned array and string access
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
20 } else { |
b05350c24596
Added InteropUtil for safe pinned array and string access
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
21 return false; |
b05350c24596
Added InteropUtil for safe pinned array and string access
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
22 } |
b05350c24596
Added InteropUtil for safe pinned array and string access
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
23 } |
b05350c24596
Added InteropUtil for safe pinned array and string access
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
24 public static implicit operator IntPtr(PinnedObject p) { return p.DangerousGetHandle(); } |
b05350c24596
Added InteropUtil for safe pinned array and string access
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
25 public static implicit operator PinnedObject(Array o) { return new PinnedObject(o); } |
b05350c24596
Added InteropUtil for safe pinned array and string access
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
26 } |
b05350c24596
Added InteropUtil for safe pinned array and string access
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
27 public class PinnedString : SafeHandle { |
b05350c24596
Added InteropUtil for safe pinned array and string access
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
28 public PinnedString(String str, Boolean unicode) |
b05350c24596
Added InteropUtil for safe pinned array and string access
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
29 : base(IntPtr.Zero, true) { |
b05350c24596
Added InteropUtil for safe pinned array and string access
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
30 SetHandle(unicode ? Marshal.StringToHGlobalUni(str) : Marshal.StringToHGlobalAnsi(str)); |
b05350c24596
Added InteropUtil for safe pinned array and string access
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
31 } |
b05350c24596
Added InteropUtil for safe pinned array and string access
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
32 public override bool IsInvalid { get { return handle == IntPtr.Zero; } } |
b05350c24596
Added InteropUtil for safe pinned array and string access
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
33 protected override bool ReleaseHandle() { |
b05350c24596
Added InteropUtil for safe pinned array and string access
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
34 Marshal.FreeHGlobal(handle); |
b05350c24596
Added InteropUtil for safe pinned array and string access
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
35 return true; |
b05350c24596
Added InteropUtil for safe pinned array and string access
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
36 } |
b05350c24596
Added InteropUtil for safe pinned array and string access
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
37 public static implicit operator IntPtr(PinnedString p) { return p.DangerousGetHandle(); } |
b05350c24596
Added InteropUtil for safe pinned array and string access
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
38 } |
b05350c24596
Added InteropUtil for safe pinned array and string access
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
39 public class PinnedStringAnsi : PinnedString { |
b05350c24596
Added InteropUtil for safe pinned array and string access
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
40 public PinnedStringAnsi(String str) : base(str, false) { } |
b05350c24596
Added InteropUtil for safe pinned array and string access
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
41 public static implicit operator PinnedStringAnsi(String s) { return new PinnedStringAnsi(s); } |
b05350c24596
Added InteropUtil for safe pinned array and string access
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
42 } |
b05350c24596
Added InteropUtil for safe pinned array and string access
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
43 public class PinnedStringUni : PinnedString { |
b05350c24596
Added InteropUtil for safe pinned array and string access
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
44 public PinnedStringUni(String str) : base(str, true) { } |
b05350c24596
Added InteropUtil for safe pinned array and string access
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
45 public static implicit operator PinnedStringUni(String s) { return new PinnedStringUni(s); } |
b05350c24596
Added InteropUtil for safe pinned array and string access
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
46 } |
b05350c24596
Added InteropUtil for safe pinned array and string access
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
47 } |