我正在尝试在RealStudio应用程序中使用Scintilla编辑器。只要消息参数不引用字符串,我就可以加载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
对于我的生活,我无法弄清楚为什么它不起作用。
答案 0 :(得分:3)
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)