Форум программистов, компьютерный форум, киберфорум
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
 Аватар для amd48
845 / 475 / 80
Регистрация: 18.05.2016
Сообщений: 1,267
Записей в блоге: 5
.NET 4.x

Половина строки в Marshal.PtrToStringAuto

13.02.2019, 11:46. Показов 1084. Ответов 3

Студворк — интернет-сервис помощи студентам
Через SendMessage отправляю команду в JetAudio. Оно отвечает через WM_COPYDATA.
Приходит две порции данных. Первая содержит соответствующий dwData для определения, на какой из запросов получаем ответ. Вторая - собственно сама строка. В lpData указатель на строку. В cbData указана длина строки. Проблема в том, что cbData всегда в два раза меньше реальной длины строки, которая должна прийти. Срезается вторая половина строки. Если использовать выражение
Marshal.PtrToStringAuto(cds.lpData)
, то длина автоматически определяется. Нет нужды использовать cbData. И в обоих случаях получаю только половину строки.
Почему так?

VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
    <StructLayout(LayoutKind.Sequential)> _
    Public Structure COPYDATASTRUCT
        Public dwData As IntPtr
        Public cbData As Int32
        Public lpData As IntPtr
    End Structure
 
    Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
        Dim cds As COPYDATASTRUCT        
        Select Case m.Msg
            Case WM_COPYDATA                
                cds = CType(m.GetLParam(GetType(COPYDATASTRUCT)), COPYDATASTRUCT)
                Select Case LastDwDate 'из первого сообщения уже знаем код запроса. в текущем сообщении имеем ответ
                    Case JRC_COPYDATA_ID_TRACK_TITLE
                        Me.lbTitle.Text = Marshal.PtrToStringAuto(cds.lpData, cds.cbData \ Marshal.SystemDefaultCharSize)
                        ...
                End Select
                LastDwDate = cds.dwData 'первое сообщение - код отправленного запроса                
        End Select
        MyBase.WndProc(m)
    End Sub
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
13.02.2019, 11:46
Ответы с готовыми решениями:

Что будет если половина контента уникальная а половина нет?
вот такой вопрос...

Последовательное хранения двух стеков в массиве из N элементов с условием(первая половина - 1 стек, вторая половина - 2)
Доброго времени. Не могу понять как сделать часть задания с размещением 2 стеков в массиве и как нужно выводить стек, без полного удаления...

Excel - половина разбитой строки на следующей странице
Есть ли способ сделать так, чтобы разбитая строка в Экселе (разбиты не все ячейки) располагалась на одной странице?

3
Модератор
Эксперт .NET
 Аватар для Yury Komar
4357 / 3427 / 512
Регистрация: 27.01.2014
Сообщений: 6,258
13.02.2019, 12:08
amd48, у вас в 15-й строке cds.cbData подвергается делению, и по всей видимости делитель равен 2-м...?
0
 Аватар для amd48
845 / 475 / 80
Регистрация: 18.05.2016
Сообщений: 1,267
Записей в блоге: 5
13.02.2019, 13:55  [ТС]
Нет. Деление вообще никак не влияет. Я этот подход, как пример, нашёл на другом форуме. Я уже пробовал и убирать деление и вручную задавать любые числа и без второго параметра работать. Результат один и тот же.
Но только что я заметил ещё, что в первом ответе возвращаемая строка имеет примерно ту самую нужную длину, но вся состоит из китайских иероглифов. Мне кажется, это то, что мне нужно. Пока гуглю, как менять кодировку.

Добавлено через 1 час 12 минут
Короче, это какая-то специфика JetAudio передавать два раза одну и ту же строку, но в разных кодировках (корейцы же). В первой передаче и есть нужная строка, но в непонятной кодировке, да ещё и попарно переставленными местами буквами. Эмпирически пришёл к такому решению Если кому будет не жалко, оптимизируйте этот мой бред:
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
    Function GetConvCh(ByVal s As String, ByVal l As Byte) As String'тут мы перекодируем и переворачиваем пары букв
        Dim r As String, t As String = ""
        Dim a As Byte() = Encoding.BigEndianUnicode.GetBytes(s)
        r = Encoding.Default.GetString(a)
        For i As Byte = 2 To l Step 2
            t = t & Mid(r, i, 1) & Mid(r, i - 1, 1)
        Next
        Return t
    End Function
 
    Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
        Dim cds As COPYDATASTRUCT
        Select Case m.Msg
            Case WM_COPYDATA
                cds = CType(m.GetLParam(GetType(COPYDATASTRUCT)), COPYDATASTRUCT)
                Select Case cds.dwData
                    Case JRC_COPYDATA_ID_TRACK_TITLE
                        Me.lbTitle.Text = GetConvCh(Marshal.PtrToStringAuto(cds.lpData), cds.cbData)
                        ...
                End Select                
        End Select
        MyBase.WndProc(m)
    End Sub
0
 Аватар для amd48
845 / 475 / 80
Регистрация: 18.05.2016
Сообщений: 1,267
Записей в блоге: 5
14.02.2019, 09:40  [ТС]
Оказалось, что используется кодировка UTF16, а в VB.net это называется Unicode. Но там ещё были разделители строк не обычные, а символом с кодом 0. В итоге оптимальный перекодировщик получается такой:
VB.NET
1
2
3
4
5
6
7
    Function GetConvCh(ByVal s As String, ByVal l As Long) As String        
        Dim a As Byte() = Encoding.Unicode.GetBytes(s)
        Dim r As String = Encoding.Default.GetString(a)
        Dim builder As New StringBuilder(r)
        builder.Replace(Chr(0), vbCrLf)
        Return builder.ToString
    End Function
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
14.02.2019, 09:40
Помогаю со студенческими работами здесь

Половина на русском половина на английском
Всем привет на компе после обновления часть плиток на английском часть на русском, новости например показываются не российские(те и надпись...

Дан массив строк без пробелов. Напечатать строки, вторая половина которых не содержит цифр
Дан массив строк без пробелов. Напечатать строки, вторая половина которых не содержит цифр.

Marshal.StructureToPtr
Пытаюсь освоить Marshal.StructureToPtr и Marshal.PtrToStructure Массивом байт я уже могу заполнить структуру: private static...

Ошибка C4996 в marshal.h
Возникла ошибка при компилировании кода с помощью marshal. Код: #include &lt;msclr\marshal_windows.h&gt; #include...

Использовние marshal.releasecomobject
Подскажите как узнать что к объекту, например, object a был применен метод Marshal.releasecomobject(a) Просто, у меня в программе в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! в-строка - входное арифметическое выражение в инфиксной(обычной). . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru