Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Delphi _ Winapi опять воду мутит

Автор: TarasBer 25.01.2012 15:35

Суть такова. Я написал свой аналог EDIT.
Все строки он хранит внутри себя в специальной структуре (заголовок я вообще не трогал), поэтому некоторые сообщения я подменил:


WM_GETTEXTLENGTH: begin
Result := TextLength(H); // H:HWND - первый параметр
Exit;
end;
WM_GETTEXT: begin
CopyText(H, W, PChar(L)); // W:WPARAM; L:LPARAM - 3 и 4 параметры
Exit;
end;


(это функции, которые возвращают суммарную длину строк из специальной структуры и копируют строки в подставляемый буфер)
И решил его проверить.

Почему-то функция, что берёт текст из него, возвращает мусор.
Сначала я увидел, что L, который пришёл в функцию, нихрена не сопадает с указателем на буфер. И хотя в PChar(L) приходят верные символы, сама строка заполняется каким-то мусором. Потом я увидел, что если W=0, то в оконный буфер вообще ничего не приходит.
В общем у меня вопрос - что за хрень происходит с сообщением после SendMessage? По-моему, оно должно просто сразу вызвать оконную функцию, вместо этого происходит что-то непонятное.
Как вообще надо правильно отвечать на WM_GETTEXT?

Автор: TarasBer 26.01.2012 10:05

ОЛОЛО, я возвращал ноль, а надо было возвращать количество скопированных символов.
Программа заработала, но вопрос, почему в оконную функцию в LPARAM приходит указатель на место в стеке, остался.

Автор: TarasBer 27.01.2012 12:37

Не, проблема не решена.
Я решил EM_GETLINE обработать.
Посмотреть, какого хрена в строке мусор оказывается.
Так вот, винда вообще не доносит сообщение до окна!!! То есть я посылаю SendMessage, но в оконную функцию ничего не приходит.
Что делать и какого хрена?

Автор: IUnknown 27.01.2012 12:52

А можно посмотреть, как именно посылается EM_GETLINE? То есть, меня интересует, что делается с параметрами WPARAM/LPARAM перед посылкой сообщения. MSDN указывает конкретно, что надо сделать (http://msdn.microsoft.com/en-us/library/windows/desktop/bb761584%28v=vs.85%29.aspx) :

Цитата
Before sending the message, set the first word of this buffer to the size, in TCHARs, of the buffer. For ANSI text, this is the number of bytes; for Unicode text, this is the number of characters. The size in the first word is overwritten by the copied line.
, это делается?

Автор: TarasBer 27.01.2012 13:12

> set the first word of this buffer to the size, in TCHARs, of the buffer

Нет, этого я не делал.
Так блин, сообщение обрабатывает МОЁ окно, и здесь Я РЕШАЮ, как обработать сообщение, почему винда позволяет себе корёжить сообщение перед тем, как его донести до окна? Почему нельзя сразу сделать
H->WndProc(H,M,W,L)?

Короче, я вообще свои собственные константы на основе WM_USER сделал, с ними таких приколов нету.

Автор: IUnknown 27.01.2012 13:21

Цитата
и здесь Я РЕШАЮ, как обработать сообщение
Перед тем, как ТВОЕ окно обработает сообщение, ты нарушаешь контракт функции, чего ты от нее ждешь потом? Правильного функционирования? Обрабатывай, как хочешь, но перед этим необходимо, чтобы сообщение ДОШЛО до твоего окна. Пока контракт не выполнен - это может не произойти. Внимание, вопрос: "Кто виноват?" Ты, не соблюдая условия, которые тебе выставляет библиотека, или библиотека, "которая слишком тупая, и не понимает, что я хочу по-своему обработать стандартное сообщение"? Ну, обрабатывай... Если получишь...