public string GetTextRange(int startPos, int endPos) { if (startPos > endPos) { return(String.Empty); } var rng = new InternalTextRange(); rng.Range.Min = startPos; rng.Range.Max = endPos; var ptr = Marshal.AllocHGlobal(Marshal.SizeOf(rng)); try { var ptr2 = Marshal.AllocHGlobal(endPos - startPos + 1); rng.Text = ptr2; try { Marshal.StructureToPtr(rng, ptr, false); Ref.Send(Sci.SCI_GETTEXTRANGE, Sci.NIL, (Int32)ptr); var ret = (InternalTextRange)Marshal.PtrToStructure(ptr, typeof(InternalTextRange)); return(Marshal.PtrToStringAnsi(ret.Text)); } finally { Marshal.FreeHGlobal(ptr2); } } finally { Marshal.DestroyStructure(ptr, typeof(InternalTextRange)); } }
public string GetTextRangeUnicode(int startPos, int endPos) { if (startPos > endPos) { return(String.Empty); } if (endPos > Ref.Send(Sci.SCI_GETTEXTLENGTH) - 1) { endPos = Ref.Send(Sci.SCI_GETTEXTLENGTH); } var rng = new InternalTextRange(); rng.Range.Min = startPos; rng.Range.Max = endPos; var ptr = Marshal.AllocHGlobal(Marshal.SizeOf(rng)); try { var ptr2 = Marshal.AllocHGlobal(endPos - startPos + 1); rng.Text = ptr2; try { Marshal.StructureToPtr(rng, ptr, false); var len = Ref.Send(Sci.SCI_GETTEXTRANGE, Sci.NIL, (Int32)ptr); var ret = (InternalTextRange)Marshal.PtrToStructure(ptr, typeof(InternalTextRange)); var buffer = new byte[len]; for (var i = 0; i < len; i++) { buffer[i] = Marshal.ReadByte(ret.Text, i); } return(Encoding.UTF8.GetString(buffer).TrimEnd('\0')); } finally { Marshal.FreeHGlobal(ptr2); } } finally { Marshal.DestroyStructure(ptr, typeof(InternalTextRange)); } }