I am trying to use the Scintilla editor in my RealStudio application. I can load the DLL, create a Scintilla child window, and send messages to the window as long as the message options do not apply to the line. If I try to get or install a string, then Windows will immediately terminate the application with error code 5 (access is denied).
Here is my code from the event of the Opencontaining window:
#If TargetWin32 Then
Declare Function CreateWindowExA Lib "User32" (ExStyle As Integer, ClassName As CString, WindowName As CString, Style As Integer, X As Integer, Y As Integer, Width As Integer, Height As Integer, Parent As Integer, Menu As Integer, Instance As Integer, Param As Ptr) As Integer
Declare Function SendMessageA Lib "User32" (HWND As Integer, Message As UInt32, WParam As Ptr, LParam As Ptr) As Integer
Const SCI_GETLENGTH = 2006
Const SCI_GETTEXT = 2182
Const WS_CHILD = &h40000000
Const WS_CLIPCHILDREN = &h02000000
Const WS_TABSTOP = &h00010000
Const WS_VISIBLE = &h10000000
' IsFunctionAvailable calls LoadLibrary and GetProcAddress
If System.IsFunctionAvailable("Scintilla_DirectFunction", "SciLexer") Then
' Create the Scintilla child window
Dim SciHandle As Integer = CreateWindowExA(0, "Scintilla", "", WS_CHILD Or WS_CLIPCHILDREN Or WS_TABSTOP Or WS_VISIBLE, 5, 5, Me.Width - 10, Me.Height - 10, Me.Handle, 0, 0, Nil)
Dim count, buffer As MemoryBlock
' Get the current character count
Dim c As Integer = SendMessageA(SciHandle, SCI_GETLENGTH, Nil, Nil) ' This works
count = New MemoryBlock(4) ' Store the count in a MemoryBlock
count.Int32Value(0) = c + 1
buffer = New MemoryBlock(c + 1) ' allocate the buffer
Call SendMessageA(SciHandle, SCI_GETTEXT, count, buffer) ' This crashes
End If
#endif
In life, I cannot understand why it does not work.