ClikeStringArray.cs 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. // NPP plugin platform for .Net v0.94.00 by Kasper B. Graversen etc.
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Runtime.InteropServices;
  5. namespace Kbg.NppPluginNET.PluginInfrastructure
  6. {
  7. public class ClikeStringArray : IDisposable
  8. {
  9. IntPtr _nativeArray;
  10. List<IntPtr> _nativeItems;
  11. bool _disposed = false;
  12. public ClikeStringArray(int num, int stringCapacity)
  13. {
  14. _nativeArray = Marshal.AllocHGlobal((num + 1) * IntPtr.Size);
  15. _nativeItems = new List<IntPtr>();
  16. for (int i = 0; i < num; i++)
  17. {
  18. IntPtr item = Marshal.AllocHGlobal(stringCapacity);
  19. Marshal.WriteIntPtr((IntPtr)((int)_nativeArray + (i * IntPtr.Size)), item);
  20. _nativeItems.Add(item);
  21. }
  22. Marshal.WriteIntPtr((IntPtr)((int)_nativeArray + (num * IntPtr.Size)), IntPtr.Zero);
  23. }
  24. public ClikeStringArray(List<string> lstStrings)
  25. {
  26. _nativeArray = Marshal.AllocHGlobal((lstStrings.Count + 1) * IntPtr.Size);
  27. _nativeItems = new List<IntPtr>();
  28. for (int i = 0; i < lstStrings.Count; i++)
  29. {
  30. IntPtr item = Marshal.StringToHGlobalUni(lstStrings[i]);
  31. Marshal.WriteIntPtr((IntPtr)((int)_nativeArray + (i * IntPtr.Size)), item);
  32. _nativeItems.Add(item);
  33. }
  34. Marshal.WriteIntPtr((IntPtr)((int)_nativeArray + (lstStrings.Count * IntPtr.Size)), IntPtr.Zero);
  35. }
  36. public IntPtr NativePointer { get { return _nativeArray; } }
  37. public List<string> ManagedStringsAnsi { get { return _getManagedItems(false); } }
  38. public List<string> ManagedStringsUnicode { get { return _getManagedItems(true); } }
  39. List<string> _getManagedItems(bool unicode)
  40. {
  41. List<string> _managedItems = new List<string>();
  42. for (int i = 0; i < _nativeItems.Count; i++)
  43. {
  44. if (unicode) _managedItems.Add(Marshal.PtrToStringUni(_nativeItems[i]));
  45. else _managedItems.Add(Marshal.PtrToStringAnsi(_nativeItems[i]));
  46. }
  47. return _managedItems;
  48. }
  49. public void Dispose()
  50. {
  51. if (!_disposed)
  52. {
  53. for (int i = 0; i < _nativeItems.Count; i++)
  54. if (_nativeItems[i] != IntPtr.Zero) Marshal.FreeHGlobal(_nativeItems[i]);
  55. if (_nativeArray != IntPtr.Zero) Marshal.FreeHGlobal(_nativeArray);
  56. _disposed = true;
  57. }
  58. }
  59. ~ClikeStringArray()
  60. {
  61. Dispose();
  62. }
  63. }
  64. }