Re[6]: Как передать указатель на буфер в win32 API
От: Litle  
Дата: 22.06.09 18:26
Оценка:
Здравствуйте, Овощ, Вы писали:

О>Здравствуйте, Аноним, Вы писали:


А>>dllimport я оттуда и брал. Но для меня роблема как объявить указатель на массив в бесике.


О>Указатель на массив сиволов может быть представлен через экземпляр класса StringBuilder. Причем свойство StringBuilder.Capacity — это размер этого массива (буффера).

О>Также желательно через атрибут MarshalAs задать тип, например так: [MarshalAs(UnmanagedType.LPStr)]. И через атрибут DllImport — кодировку [DllImport(..., CharSet = CharSet.Ansi, ...)].
Хорошо, я имею переременную StringBuilder. Но мне нужна переменная intPtr? как мне её получить....

Сделал сам, но мне кажется убого. Если кто подскажет более правильный вариант — буду признателен.

Прототип.
    <DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _
    Public Shared Function SendMessage( _
        ByVal hWnd As IntPtr, _
        ByVal Msg As UInteger, _
        ByVal wParam As IntPtr, _
        ByVal lParam As IntPtr) As IntPtr
    End Function



Код в функции.
        Dim length As IntPtr = SendMessage(hwnd, WM_GETTEXTLENGTH, 0, 0)
        
        ' Выделение памяти под буфер 
        Dim buffer As IntPtr = Marshal.AllocHGlobal((length.ToInt32 + 1) * 2) ' размер символа - 2байта

        SendMessage(hwnd, WM_GETTEXT, (length.ToInt32 + 1), buffer)
        Dim returnValue As String = Marshal.PtrToStringUni(buffer)

        ' Очистка памяти
        Marshal.FreeHGlobal(buffer)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.