При отправке SCI_GETTEXT (и других) происходит сбой приложения
Я пытаюсь использовать редактор Scintilla в моем приложении RealStudio. Я могу загрузить DLL, создать дочернее окно Scintilla и отправлять сообщения в окно до тех пор, пока параметры сообщения не ссылаются на строку. Если я пытаюсь получить или установить строку, Windows немедленно завершает работу приложения с кодом ошибки 5 (доступ запрещен).
Вот мой код от Open
Событие содержащего окна:
#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
Что касается моей жизни, я не могу понять, почему это не работает.
1 ответ
Решение
SCI_GETTEXT объявлен следующим образом:
SCI_GETTEXT(int length, char *text)
Это означает: вы передаете параметр длины в виде целого числа и указатель на текстовый буфер.
Ваш код, однако, передает указатель на целое число для длины. Попробуйте это вместо этого:
Declare Function SendMessageAip Lib "User32" (HWND As Integer, Message As UInt32, WParam As Integer, LParam As Ptr) As Integer
buffer = New MemoryBlock(c + 1) ' allocate the buffer
Call SendMessageAip(SciHandle, SCI_GETTEXT, c+1, buffer)