Страница: 1 | 2 | 3 |
|
Вопрос: SendMessage()
|
Добавлено: 26.02.06 20:20
|
|
Автор вопроса: Sacred Phoenix | ICQ: 304238252
|
Вызываю SendMessage(hWnd, WM_COMMAND, &h1, ByVal "Hello!"). В subclass-функции WindowProc(ByVal hWnd&, ByVal uMsg&, ByVal wParam&, ByVal lParam&) последний параметр передается целым числом. Как получить переданную строку? (по ходу возвращается указатель?)
Ответить
|
Номер ответа: 1 Автор ответа: HOOLIGAN
Вопросов: 0 Ответов: 1066
|
Профиль | | #1
|
Добавлено: 26.02.06 20:51
|
Открою тебе страшную тайну ), которая для vb-программера может показаться ересью: СТРОКИ НЕ ПЕРЕДАЮТ В КАЧЕСТВЕ ПАРАМЕТРОВ!!!
Передают только адреса строк. И то число, которое ты увидел в subclass-функции - это и есть адрес твоей строки.
Делаешь так:
WindowProc( ByVal hWnd&, ByVal uMsg&, ByVal wParam&, ByVal lParam&
Dim S As String
S=Space$(wParam+1)
Call CopyMemory(S, lParam, wParam+1)
MsgBox S
Параметром h1 передавай длину строки.
Ответить
|
Номер ответа: 2 Автор ответа: HOOLIGAN
Вопросов: 0 Ответов: 1066
|
Профиль | | #2
|
Добавлено: 26.02.06 21:21
|
Можно попробовать ещё вариант - не CopyMemory, которая требует количество байт для копирования, а что-то из разряда апи - lstrcpy например. Ей длина не нужна.
Ответить
|
Номер ответа: 6 Автор ответа: HOOLIGAN
Вопросов: 0 Ответов: 1066
|
Профиль | | #6
|
Добавлено: 26.02.06 23:30
|
'Длину передавать не надо
Private Declare Function lstrcpy Lib "kernel32" Alias "lstrcpyW" ( ByVal lpString1 As String, _
ByVal lpString2 As Long) As Long
Function WindowProc( ByVal hWnd&, ByVal uMsg&, ByVal wParam&, ByVal lParam& As Long
'чтобы lstrcpy не отрезала строку по первому символу
'возьмём её юникод-версию - lstrcpyW
Dim SSS As String 'Объявляем строку - приемник - буфер
SSS = String$(512, Chr$(0)) 'Растягиваем этот буфер под достаточный размер
lstrcpy ByVal SSS, ByVal lParam 'копируем в него наши символы как юникод
SSS = StrConv(SSS, vbFromUnicode) 'преобразуем из юникода в vb-строку
Debug. Print SSS 'наслаждаемся результатом
End Function
Банзай!
Ответить
|
Номер ответа: 10 Автор ответа: HOOLIGAN
Вопросов: 0 Ответов: 1066
|
Профиль | | #10
|
Добавлено: 28.02.06 01:33
|
ANDREY
Я знаю, что такое bstr, и где лежит длина строки.
Нет, такого ограничения нигде нету Однако stdcall требует что бы суммарная длина всех параметров была всегда одинаковой
Это ты хорошо подумал, прежде чем сказать? Если нет, то сначала надо подумать, а лучше подучить матчасть, прежде чем делать такие заявления.
Кроме того передавать всю строку в качестве парметров не целесообразно с точки зрения скорости. Поэтому и передается указатель.
Строку передать невозможно. VB создает копию строки, и передает указатель на эту копию. Вот отчего снижается скорость: из-за копирования/преобразования. Ты просто слышал звон (о копировании строки при передаче в функции), но откуда этот звон так и не понял.
Так что подучи матчасть
Вот тебе пример:
msgString db "Message String",0
push 0
push 0
push offset msgString
push 0
call MessageBox
Это аналог MessageBox ByVal 0, ByVal "Message String", ByVal 0, ByVal 0
Возьми справочник по опкодам и посмотри что делают инструкции push. Сколько байт они ложат в стек процессора i386.
И заучи, как "Отче Наш": строки не передаются никуда, передаются их адреса, либо адреса их копий, что то же самое.
Ответить
|
Номер ответа: 12 Автор ответа: ANDREY
Вопросов: 0 Ответов: 33
|
Профиль | | #12
|
Добавлено: 28.02.06 08:52
|
Возьми справочник по опкодам и посмотри что делают инструкции push. Сколько байт они ложат в стек процессора i386.
Сам возьми. Кроме того, кто тебе сказал что в стэк данные можно положить только командой push?
Строку передать невозможно Если это cdecl функция то не вижу тут ничего невозможного.
Это ты хорошо подумал, прежде чем сказать? А ты слышал про команды push r16 и push r8?
Ответить
|
Номер ответа: 14 Автор ответа: HOOLIGAN
Вопросов: 0 Ответов: 1066
|
Профиль | | #14
|
Добавлено: 28.02.06 12:55
|
push ax - реально
И что ? Ты сможешь сделать
mov ax,offset msgString
push ax
???
Попробуй Только не надо мне говорить, что можно сделать два раза push ax, т.к. это эквивалентно push eax
ANDREY
Я тебе привел пример. С push 0 и push offset msgString
Для особо одаренных повторю вопрос:
сколько байт ложит в стек push 0 и сколько ложит push offset msgString ?
А ты слышал про команды push r16 и push r8?
Ещё раз повторю: Думай, прежде чем говорить
push r8 - это что такое? Ты можешь сделать push al ?? Или push dh ???
Кроме того, кто тебе сказал что в стэк данные можно положить только командой push?
Я не говорю о том, что данные можно положить только с помощью push. И способов положить я знаю наверняка поболее чем ты
А чтобы ты не уводил разговор в сторону от темы, у меня к тебе просьба: сделай мне пример, который:
1. Читает текстовый файл размером 2 Мб в переменную типа String
2. Передает эту строку !ИМЕННО ВСЮ СТРОКУ - ВСЕ 2 МБ! а не просто указатель на неё, в качестве параметра в WndProc.
3. Считывает эту строку в WndProc и выводит длину строки и саму строку в читабельном виде любым удобным для тебя способом.
Напомню тебе твои слова:
передавать всю строку в качестве парметров не целесообразно с точки зрения скорости
Пусть это будет медленно, хоть день пусть займет, но раз ты считаешь, что это возможно, докажи это.
Если ты сделаешь это, я первый признаю, что ты гений. Если нет - определение себе придумаешь сам.
Жду пример.
А пока для предотвращения флейма скажу:
обсуждать твои перлы типа push r8 или stdcall требует что бы суммарная длина всех параметров была всегда одинаковой
обсуждать не намерен.
Итак, жду пример...
Пока его нет - ни слова
Ответить
|
Страница: 1 | 2 | 3 |
Поиск по форуму