Здравствуйте, Овощ, Вы писали:
О>Здравствуйте, Аноним, Вы писали:
А>>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)