【问题标题】:Sending SCI_GETTEXT (and others) crashes the application发送 SCI_GETTEXT(和其他)会使应用程序崩溃
【发布时间】:2014-03-01 05:11:52
【问题描述】:

我正在尝试在我的 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

对于我的一生,我无法弄清楚为什么它不起作用。

【问题讨论】:

    标签: scintilla xojo realstudio scilexer.dll


    【解决方案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)
    

    【讨论】:

    • 谢谢!我一直认为它比实际更复杂。
    猜你喜欢
    • 1970-01-01
    • 2021-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-05
    相关资源
    最近更新 更多