Как передать указатель на буфер в win32 API
От: Litle  
Дата: 22.06.09 13:29
Оценка:
Пишу на бесике:

SendMessage(hwnd, WM_GETTEXT, (length.ToInt32 + 1), buffer(0))

Как объявить переменную buffer?
Re: Как передать указатель на буфер в win32 API
От: Smarty Россия  
Дата: 22.06.09 14:52
Оценка:
Здравствуйте, Litle, Вы писали:

L>Пишу на бесике:


L>SendMessage(hwnd, WM_GETTEXT, (length.ToInt32 + 1), buffer(0))


L>Как объявить переменную buffer?


Тынц.
Re[2]: Как передать указатель на буфер в win32 API
От: Litle  
Дата: 22.06.09 16:39
Оценка:
Здравствуйте, Smarty, Вы писали:

S>Здравствуйте, Litle, Вы писали:


L>>Пишу на бесике:


L>>SendMessage(hwnd, WM_GETTEXT, (length.ToInt32 + 1), buffer(0))


L>>Как объявить переменную buffer?


S>Тынц.

будьте добры по-подробней.
Дллимпортом я умею пользоваться.
Re[3]: Как передать указатель на буфер в win32 API
От: Smarty Россия  
Дата: 22.06.09 17:10
Оценка:
Здравствуйте, Litle, Вы писали:

L>будьте добры по-подробней.

L>Дллимпортом я умею пользоваться.

Так а куда проще/подробнее? Там же ГОТОВЫЕ СИГНАТУРЫ, и на C# и на VB.NET. Вообще все прописано, тупой копи-паст остался. Поиск юзали по требуемой функции? На том сайте имею в виду, не на РСДНе.
Re[4]: Как передать указатель на буфер в win32 API
От: Аноним  
Дата: 22.06.09 17:18
Оценка:
Здравствуйте, Smarty, Вы писали:

S>Здравствуйте, Litle, Вы писали:


L>>будьте добры по-подробней.

L>>Дллимпортом я умею пользоваться.

S>Так а куда проще/подробнее? Там же ГОТОВЫЕ СИГНАТУРЫ, и на C# и на VB.NET. Вообще все прописано, тупой копи-паст остался. Поиск юзали по требуемой функции? На том сайте имею в виду, не на РСДНе.

dllimport я оттуда и брал. Но для меня роблема как объявить указатель на массив в бесике.
Re[5]: Как передать указатель на буфер в win32 API
От: Овощ http://www.google.com
Дата: 22.06.09 17:32
Оценка:
Здравствуйте, Аноним, Вы писали:

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


Указатель на массив сиволов может быть представлен через экземпляр класса StringBuilder. Причем свойство StringBuilder.Capacity — это размер этого массива (буффера).
Также желательно через атрибут MarshalAs задать тип, например так: [MarshalAs(UnmanagedType.LPStr)]. И через атрибут DllImport — кодировку [DllImport(..., CharSet = CharSet.Ansi, ...)].
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)
Re[7]: Как передать указатель на буфер в win32 API
От: Овощ http://www.google.com
Дата: 22.06.09 18:31
Оценка: 1 (1)
Не надо больше ничего. Укажите StringBuilder прямо в прототипе (from PInvoke.net):

[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)]
static extern IntPtr SendMessage(IntPtr hWnd, Int32 Msg, IntPtr wParam, StringBuilder lParam);


Все. Дальше просто передавайте ваш StringBuilder при вызове этого метода.
Re[8]: Как передать указатель на буфер в win32 API
От: Litle  
Дата: 22.06.09 18:44
Оценка:
Здравствуйте, Овощ, Вы писали:

О>Не надо больше ничего. Укажите StringBuilder прямо в прототипе (from PInvoke.net):


О>
О>[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)]
О>static extern IntPtr SendMessage(IntPtr hWnd, Int32 Msg, IntPtr wParam, StringBuilder lParam);
О>


О>Все. Дальше просто передавайте ваш StringBuilder при вызове этого метода.


Спасиб!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.