|
winapi SendMessage LB_GETTEXT возвращает только 8 символов
|
|||
---|---|---|---|
#18+
Добрый день. Такая проблема. Пытаюсь из ListBox вытащить значение. Dim V$ = Space(99) MsgBox(SendMessage(wnd, LB_GETTEXT, 15, V)) MsgBox("$" + V + "$") 2-е окно выдает $ + 8 символов + непонятный символ. Замыкающего $ нет. Сама SendMessage возвращает почему-то 8, вместо 9 и более, если другие числа подставлять. В чем может быть проблема? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2014, 12:15 |
|
winapi SendMessage LB_GETTEXT возвращает только 8 символов
|
|||
---|---|---|---|
#18+
GustlyDim V$ = Space(99)0) Это по-каковски? 1) Любой вопрос по API, в котором не приведено описание API (Declare), можно сразу отправлять в топку. Потому, что иначе гадание и потеря времени. Вангую описание lParam без ByVal. 2) Лучше приложить к сообщению минимальный проект, на котором наблюдается эдефект. 3) Замыкающего "$" MsgBox не выдаёт из-за того, что в строке есть символ с кодом 0, считающийся окончанием строки. Багофича. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2014, 16:27 |
|
winapi SendMessage LB_GETTEXT возвращает только 8 символов
|
|||
---|---|---|---|
#18+
13-й квартал, Спасибо что ответили. 0) Это по-каковски? Win7 x64, visual studio express 2012, visual basic project 1) Любой вопрос по API, в котором не приведено описание API (Declare), можно сразу отправлять в топку. Потому, что иначе гадание и потеря времени. Вангую описание lParam без ByVal. Код в спойлере 2) Лучше приложить к сообщению минимальный проект, на котором наблюдается эдефект. Код в спойлере 3) Замыкающего "$" MsgBox не выдаёт из-за того, что в строке есть символ с кодом 0, считающийся окончанием строки. Багофича. Увы. Дефект словил только в целевой проге. Если я в хэндл передаю ListBox из моего окошка, вроде как строку полностью возвращает. Например я вижу слово "Functions" возвращает "Function" а LB_GETTEXTLEN = 46 "frame_templates" возвращает "frame_te" а LB_GETTEXTLEN = 58. При этом сама LB_GETTEXT всегда возвращает 8, если я объявлял SendMessageA и 4 если SendMessageW Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107.
Модератор: Тема перенесена из форума "Visual Basic". ... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2014, 16:47 |
|
winapi SendMessage LB_GETTEXT возвращает только 8 символов
|
|||
---|---|---|---|
#18+
Возвращаясь к теме. Может ли это быть из-за того, что целевое приложение очень старое и 32-битное, а я пишу в х64 винде. Можно ли как-то подключить user32.dll с sendmessage например от windows XP или 98 ? ... |
|||
:
Нравится:
Не нравится:
|
|||
08.09.2014, 16:29 |
|
winapi SendMessage LB_GETTEXT возвращает только 8 символов
|
|||
---|---|---|---|
#18+
Gustly, нет дело не в разрядности винды. Нет не надо даже пытаться заменить user32 более старой версией. Что нужно так это переписать код посылки LB_GETTEXT: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.
Важным является использование StringBuilder в качестве четвертого аргумента. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.09.2014, 18:55 |
|
winapi SendMessage LB_GETTEXT возвращает только 8 символов
|
|||
---|---|---|---|
#18+
bazile, Спасибо за код, но Код: vbnet 1. 2. 3. 4.
4-я строка вызывает An unhandled exception of type 'System.AccessViolationException' occurred in System.Windows.Forms.dll Additional information: Attempted to read or write protected memory. This is often an indication that other memory is corrupt. При этом textLen всегда 8 символов, независимо от 3-го параметра (wParam The zero-based index of the string. ) ... |
|||
:
Нравится:
Не нравится:
|
|||
09.09.2014, 11:45 |
|
winapi SendMessage LB_GETTEXT возвращает только 8 символов
|
|||
---|---|---|---|
#18+
Gustly, Не могу понять что Вы добиваетесь. Если передать текстовую строку через меседж, имхо вектор рассуждений не пральный, есть общепринятые решения для этого дела, Пож? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.09.2014, 11:53 |
|
winapi SendMessage LB_GETTEXT возвращает только 8 символов
|
|||
---|---|---|---|
#18+
Gustly, почему ты получаешь длину для элемента 4, а потом просишь текст элемента 1? Или все элементы имеют одинаковую длину? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.09.2014, 12:23 |
|
winapi SendMessage LB_GETTEXT возвращает только 8 символов
|
|||
---|---|---|---|
#18+
Где-то в степи, Конечная цель - поиск по listbox в стороннем приложение. Но сейчас банально не могу получить правильное значение выбранного элемента. Если я указываю handle от listbox в моем приложение, то через win api все нормально возвращается, если же handle от целевого listbox, то не более 8 символов. bazile Код закомментарен, поэтому там 1, а вообще я разные индексы пробовал, везде одна и та же ошибка. Вообще если сделать объявление не SendMessageW, а SendMessageA , то возвращаемая длина становится разной, но все равно непонятной. У "!TEST.SQS" - возвращает 27, У "!TEST23.SQS" возвращает 29 ... |
|||
:
Нравится:
Не нравится:
|
|||
09.09.2014, 12:34 |
|
winapi SendMessage LB_GETTEXT возвращает только 8 символов
|
|||
---|---|---|---|
#18+
Сейчас вот поменял в объявление функции ByRef lParam As StringBuilder на ByVal lParam As StringBuilder Ошибка исчезла, но возвращается беда. !TEST23.°2BЂъяя !TEST23.xъЅД !TEST23.°2BЂъяя !TEST23.xъЅД !TEST23.xъЅД !TEST23.xъЅД !TEST23.°2BЂъяя !TEST23.xъЅД !TEST23.xъЅД !TEST23.xъЅД !TEST23.°2BЂъяя Вместо "!TEST23.SQS" То есть вернул 8 символов + непонятно что ... |
|||
:
Нравится:
Не нравится:
|
|||
09.09.2014, 12:40 |
|
winapi SendMessage LB_GETTEXT возвращает только 8 символов
|
|||
---|---|---|---|
#18+
подозреваю, что память под строку надо выделить с помощью Код: c# 1.
потом удалить через System.Runtime.InteropServices.Marshal.FreeHGlobal ... |
|||
:
Нравится:
Не нравится:
|
|||
09.09.2014, 16:01 |
|
winapi SendMessage LB_GETTEXT возвращает только 8 символов
|
|||
---|---|---|---|
#18+
Попробовал, ошибки нет, но все равно 4 символа + кракозябры. Есть еще способы получить значение listbox в чужом приложение? Все таки попробовал подключить user32.dll от winXP x86 , Visual Studio вылетела с ошибкой при попытки добавить в проект dll. Других причин не вижу, почему из моего же EXEшника нормально вытаскиваются значения, а из этого динозавра только 4 или 8 символов. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.09.2014, 16:10 |
|
winapi SendMessage LB_GETTEXT возвращает только 8 символов
|
|||
---|---|---|---|
#18+
Gustly, попробуй в моем примера подставить такую сигнатуру SendMessage: Код: vbnet 1. 2.
Я его проверил на своей машине и он сработал. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.09.2014, 16:58 |
|
winapi SendMessage LB_GETTEXT возвращает только 8 символов
|
|||
---|---|---|---|
#18+
bazile, len=8 吡卅쩬_༄ 1-я строка это результат SendMessage(ControlHandle, LB_GETTEXTLEN, 1, 0) 2-я строка это 4-й параметр от SendMessage(ControlHandle, LB_GETTEXT, 1, sb) ... |
|||
:
Нравится:
Не нравится:
|
|||
09.09.2014, 17:15 |
|
winapi SendMessage LB_GETTEXT возвращает только 8 символов
|
|||
---|---|---|---|
#18+
Gustly, попробуй UnmanagedType.LPStr и UnmanagedType.LPTStr. Также можно попробовать ANSI версию SendMessage, то есть SendMessageA. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.09.2014, 17:46 |
|
winapi SendMessage LB_GETTEXT возвращает только 8 символов
|
|||
---|---|---|---|
#18+
bazile, С ANSI версией длина 28 (реальная длина + 18). С UnmanagedType.LPTStr помимо китайского начал еще и шрифт искажаться С UnmanagedType.LPStr получаю: len=28 !TESьа€Hб€ len=28 !TES len=28 !TES len=28 !TES len=28 !TES В инете видел упоминание программы, "текст граблер" (дословно), но такую не нашел, она якобы могла любой выбранный селект лист записать в тестовый файл. Кто-нибудь слышал? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2014, 11:04 |
|
winapi SendMessage LB_GETTEXT возвращает только 8 символов
|
|||
---|---|---|---|
#18+
Раз пока других идей нет. Подскажите пожалуйста как правильно подцепить sendmessage из других dll ? Даже когда пытаюсь добавить родной user32.dll ругается что не может, мол dll неправильный, если же пытаюсь добавить от winXP то вылетает студия с ошибкой. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2014, 17:09 |
|
winapi SendMessage LB_GETTEXT возвращает только 8 символов
|
|||
---|---|---|---|
#18+
Gustly, давай попробуем проверить что будет если исключить .NET-ий маршаллинг. Выделяем память вручную и вручную же преобразовываем байты в строку. Главное посмотри что у тебя в переменной buffer перед возвратом из функции. Все ли символы на месте. Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28.
GustlyДаже когда пытаюсь добавить родной user32.dll ругается что не может, мол dll неправильный Если ты пытаешься добавить reference на user32, то это бесполезно т.к. reference делаются только на управляемые сборки, которой user32.dll не является. Вообще же идея с подменой user32 на старую версию мне кажется тупиковой. Врядли дело в SendMessage и, главное, непонятно как поведет себя приложение если в нее загрузить две разных версии user32 - если Windows это вообще позволит. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.09.2014, 02:01 |
|
winapi SendMessage LB_GETTEXT возвращает только 8 символов
|
|||
---|---|---|---|
#18+
и еще один вариант с Ansi версией SendMessage: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29.
... |
|||
:
Нравится:
Не нравится:
|
|||
11.09.2014, 02:19 |
|
winapi SendMessage LB_GETTEXT возвращает только 8 символов
|
|||
---|---|---|---|
#18+
bazile, Длина буфера 29. Функция возвращает первые 4 симола + 1 случайный символ, иногда цыфра 9 иногда буква m. Судя по winspector и предыдущим экспериментам лучше пользоваться только ANSI версией. Еще заметил, если запускать итоговый EXE с совместимостью XP например или Win 2000, то краказябр после 4 символов нет, всегда 4 символа и всегда родные. Попробовал другую прогу, тот же winspector которым я хэндлы ищу, из его listbox вернулась строка с 50+ символов, где она в приложение именно не увидел, но вернулась она полная. Возможно ли что в целевом приложение listbox какой-то не такой? Вот внешний вид. Может натолкнет на мысль. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.09.2014, 09:48 |
|
winapi SendMessage LB_GETTEXT возвращает только 8 символов
|
|||
---|---|---|---|
#18+
Gustly, на скриншоте List View, а не List Box. Попробуй получить его текст с помощью сообщения LVM_GETITEMTEXT . ... |
|||
:
Нравится:
Не нравится:
|
|||
11.09.2014, 09:57 |
|
winapi SendMessage LB_GETTEXT возвращает только 8 символов
|
|||
---|---|---|---|
#18+
bazile, SendMessage(ControlHandle, LVM_GETITEMTEXT, 10, h) Возвращает 1 случайный символ Вот свойства объекта ... |
|||
:
Нравится:
Не нравится:
|
|||
11.09.2014, 10:03 |
|
winapi SendMessage LB_GETTEXT возвращает только 8 символов
|
|||
---|---|---|---|
#18+
Gustly, это все-таки List Box, но он owner-draw. Возможно в этом корень проблемы. Может в реализации ListBox баг какой-то. Надо изучать память этого процесса и чтобы понять как вытащить эти строки. Можно также попытаться получать не текст, а данные связанные с ним через LB_GETITEMDATA. И посмотреть что находится в этом участке памяти. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.09.2014, 11:05 |
|
winapi SendMessage LB_GETTEXT возвращает только 8 символов
|
|||
---|---|---|---|
#18+
bazile, У меня еще проблема, мне каждый раз приходится искать в интернете объявления этих констант (LB_GETITEMDATA). Что надо прописать чтобы они подцепились нормально? ... |
|||
:
Нравится:
Не нравится:
|
|||
11.09.2014, 11:08 |
|
|
start [/forum/topic.php?fid=20&msg=38741494&tid=1402490]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
576ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
63ms |
get tp. blocked users: |
2ms |
others: | 15ms |
total: | 700ms |
0 / 0 |