Форум: "Потрепаться";
Текущий архив: 2004.11.28;
Скачать: [xml.tar.bz2];
ВнизНепонятна работа GetWindowText Найти похожие ветки
← →
Piter © (2004-11-06 22:12) [40]Игорь Шевченко © (06.11.04 20:53) [35]
Вот мой код работает точно по приведенному описанию. Из чего я делаю вывод, что дело не в Windows
ВСТАВИЛ ИМЕННО ЭТОТ КОД - У МЕНЯ ВЫДАЕТ "FORM1".
Из чего я делаю вывод, что глюк не во мне. Все это я проделываю в ЧИСТОМ проекте. Могу прислать проект на мыло.
марсианин © (06.11.04 20:36) [34]
у меня в WinXP HE без сервис-паков - такая же фигня
еще интереснее. Я проверял на WinXP без сервис паков - все ок. А у тебя какой сервис пак?
Получается, на W2k SP2 глюк есть, на SP3/SP4 исправили. На WinXP глюка нету, но он есть на WinXP SP1(2?)?
Игорь Шевченко © (06.11.04 20:53) [35]
Я тебе искренне советую посмотреть свой код отладчиком, можно даже в CPU Window залезть, чтобы понять, в чем причина
ну черт побери. ЧИСТЫЙ ПРОЕКТ. ВАШ КОД!
Почему вы не можете поверить? :)
Тем более, я не один это говорю.
Verg © (06.11.04 21:04) [36]
ой, парни, ну в конце концов, я уже говорил - не перекладывайте вы "с больной головы на здоровую" - указыайте правильно параметры при вызовах API ф-ций, и будет все зашибись
между прочим, я указываю ПРАВИЛЬНЫЕ ПАРАМЕТРЫ. Чем мои параметры неправильны? Я волен указать любое число. В документации по этому поводу ничего не сказано.
Verg © (06.11.04 21:04) [36]
Какой еще "глюк"? :) Не смешите мои тапочки. :))
Какой глюк? А ты как будто не знаешь? Хорошо, берем код:procedure TForm1.Button1Click(Sender: TObject);
var
P: PChar;
I: Integer;
begin
Caption := "Ну это просто заголовок формы сделан просто так, чтобы память забить";
I := GetWindowTextLength(Handle);
GetMem(P, I);
GetWindowText(Handle, P, I);
FreeMem(P);
Caption := "Caption12";
I := GetWindowTextLength(Handle);
GetMem(P, I);
GetWindowText(Handle, P, I);
ShowMessage(p); // интересно, ЧТО ЗДЕСЬ ОКАЖЕТСЯ?
FreeMem(P);
end;
И знаешь что оказалось? Заголовок то равен "Caption12", а знаешь что мне код вернул?
"Caption12у это просто заголовок формы сделан просто так, чтобы память забить"
Это значит не глюк?
В MSDN есть такая строчка:
"If the window text string is as long or longer than the buffer, the string is truncated and terminated with a NULL character. " ?!
Так вот эта строчка для Windows 2000 SP2 не выполняется, что может привести к краху программы. Все равно не глюк?
← →
Piter © (2004-11-06 22:13) [41]Игорь Шевченко © (06.11.04 22:05) [39]
Я бы делал вообще по-другому, если бы мне нужно было получить текст из окна
как?
← →
Verg © (2004-11-06 22:59) [42]
> [40] Piter © (06.11.04 22:12)
Ты несешь уже откровенную чушь.
← →
Игорь Шевченко © (2004-11-06 23:11) [43]Piter © (06.11.04 22:13) [41]
> как?
var
AText : array[0..MAX_PATH] of char;
begin
GetWindowText(AWindowHandle, AText, SizeOf(AText));
....
end;
Так.
> Хорошо, берем код:
И мне этот код выдает "Caption1";
D6, стандартные настройки для проекта.
Я тебе еще раз советую, пройдись отладчиком по CPU Window, оно всем уже интересно
← →
Verg © (2004-11-06 23:33) [44]
> между прочим, я указываю ПРАВИЛЬНЫЕ ПАРАМЕТРЫ. Чем мои параметры
> неправильны? Я волен указать любое число. В документации
> по этому поводу ничего не сказано.
Ты пойми, вьюноша, что права, дай Бог, ты будешь качать в другом месте....
Здесть тебе сказано однозначно: Specifies the maximum number of characters to copy to the buffer, including the NULL character. - какого хрена ты хочешь поднять волну? Другими словами - тебе не ясно, что там написано в документации?????? Ты до сих пор не смог в это врубиться?
Тебе неуютно в этом мире? Ты не дружишь с собственной головой? Нет, ну ты скажи - мы все потдержим!
P.S. Ну злишь ты меня, как никто другой..... своей упертостью. Иногда граничащей с тупостью....
← →
Piter © (2004-11-07 02:06) [45]Verg © (06.11.04 22:59) [42]
Ты несешь уже откровенную чушь
спасибо, что разъяснил
Игорь Шевченко © (06.11.04 23:11) [43]
И мне этот код выдает "Caption1";
ИГОРЬ! Ну как вы не поймете - я вам верю, что у вас все ок! Более того, на WinME и WinXP у меня тоже все ок! А на WINDOWS 2000 SP2 НЕ ОК! Ну сколько можно повторять? Вот я создал EXE"шник - запускаю его из под w2k SP2 - глючит. Запускаю из под XP - нормально. Какие вам доказательства нужны? Если вы хотите - могу привести скриншот из CPU window.
В чем проблема? Очевидно, ошибка в WinApi. В w2k SP3 ее исправили. Что с того? Ведь сервис паки не просто так выпускают? :)
Ну если так не верится - достаньте где-нибудь w2k SP2 и убедитесь!
Verg © (06.11.04 23:33) [44]
Ты пойми, вьюноша, что права, дай Бог, ты будешь качать в другом месте....
какие права? Что я качаю? Я сообщаю о баге. Да, я считаю это багом. Вы не можете опровергнуть что это баг и ругаетесь на меня. За что? Или вы считаете, что я в принципе не могу понять всей проблемы? Или в чем проблема? Если вы не считаете это багом - аргументированно докажите, почему так считаете.
Specifies the maximum number of characters to copy to the buffer, including the NULL character. - какого хрена ты хочешь поднять волну?
да, в документации это написано. А я что, в своем примере нарушаю это?! Я выделил I байт под буфер. Я передаю в функцию это число I, которое задает длину буфера, ВКЛЮЧАЯ терминирующий символ. Где я пошел против документации?! ГДЕ?
Может, ты не понимаешь, что я пишу и в очередной раз спросишь что мне не нравится? Я отвечу. Мне не нравится, что система идет против документации. В документации написано:
"If the window text string is as long or longer than the buffer, the string is truncated and terminated with a NULL character. "
Я плохо знаю английский - признаю. Но трактую это так, что если размера буфера не хватает для записи полной строки заголовка + терминирующего символа, то строка усекается, но терминирующий символ по любому будет записан, о чем недвусмысленно дает понять фраза:
"and terminated with a NULL character"
Более того, это ожидаемое поведение от WinApi функции. Ведь если она не запишет признак окончания строки - как я узнаю где строка кончается? Конечно, я могу судить по возвращаемому значению, которое говорит о количестве записанных символов, но это не оправдывает того, что система забыла записать терминирующий символ.
Более того, я вам привел пример, который построен правильно с точки зрения документации, но который выдает полную фигню на некотором ПО.
Более того, как я понял ты не считаешь такое проявление ошибкой? Зато вот Microsoft, судя по всему, таки считает это ошибкой, если в своих сервис паках она ликвидировала данное недоразумение. И я солидарен с этим решением. Но ты видимо нет. Ты, наверное, считаешь, что вовсе не надо было переделывать данную функцию?
Тогда аргументировано, пожалуйста, обоснуй свою позицию почему это не глюк. Желательно последовательно, в том духе почему приведенная мной программа работает неправильно - где там ошибка?
Если аргументы на уровне "ты, Питер, дурак и ничего не понимаешь" - то можешь ничего не писать. Мне это уже неоднократно высказывали и влияние на меня это не оказывает, особенно потому, что в некоторых случаях я все таки был прав.
Игорь Шевченко © (06.11.04 23:11) [43]
var
AText : array[0..MAX_PATH] of char;
begin
GetWindowText(AWindowHandle, AText, SizeOf(AText));
....
я тоже об этом думал. Но вроде MAX_PATH говорит только о максимальном размере пути в файловой системе! Или для заголовков окон такое ограничение тоже присутствует? Употребление данной конструкции в GetWindowDirectory я понимаю. А точно для GetWindowText это подходит?
← →
Piter © (2004-11-07 02:06) [46]Verg © (06.11.04 23:33) [44]
Ну злишь ты меня, как никто другой..... своей упертостью. Иногда граничащей с тупостью
ну и ты меня злишь тем, что даже не хочешь понять, что я тебе хочу сказать
← →
Verg © (2004-11-07 17:20) [47]Да ладно, не бери в голову - сегодня праздник как ни как.
Давай лучше нальем и выпьем за согласие и примирение.
Ты со мной согласен? :)
← →
Игорь Шевченко © (2004-11-07 17:26) [48]Piter © (07.11.04 02:06) [45]
извини, у меня вопрос - до тебя с какого раза просьба посмотреть в CPU Window дойдет ?
С праздничком:)
← →
GuAV © (2004-11-07 17:51) [49]Игорь Шевченко © (06.11.04 23:11) [43]
var
AText : array[0..MAX_PATH] of char;
begin
GetWindowText(AWindowHandle, AText, SizeOf(AText));
....
end;
А причём тут MAX_PATH ?
Заголовки окон бывают и длинее.
← →
Игорь Шевченко © (2004-11-07 17:57) [50]GuAV © (07.11.04 17:51) [49]
Мне достаточно. Насчет заголовков окон длиннее 260 символов - так GetWindowText обрежет. Мне анализировать их содержимое (длинных заголовков) не приходилось, чаще всего показывать, а сверхдлинный текст смотреть неудобно. Потому и привожу свой способ.
← →
Piter © (2004-11-07 19:18) [51]Игорь Шевченко © (07.11.04 17:26) [48]
извини, у меня вопрос - до тебя с какого раза просьба посмотреть в CPU Window дойдет ?
ну а что там смотреть? Вот я скомпилировал EXE"шник. Я его запускаю под win 2000 SP2 - глючит. Запускаю под WindowsXP - не глючит. ОДИН И ТОТ ЖЕ EXE"ШНИК. Какие еще доказательства нужны? Я не знаю, что смотреть в CPU Windows. Если хотите посмотреть - пожалуйста. Чистый проект, настройки по дефолту, код такой:program Project1;
uses
Forms,
Unit1 in "Unit1.pas" {Form1};
{$R *.res}
begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
----------------------------------------------------------------------------
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
S: string;
I: Integer;
begin
I := GetWindowTextLength(Handle);
SetLength(S, I);
GetWindowText(Handle, PChar(S), I);
ShowMessage(S);
end;
end.
Данный код выдает "Form1"
Вот окно CPU window:
http://piter007.newmail.ru/cpu.gif
← →
Игорь Шевченко © (2004-11-07 21:16) [52]Piter © (07.11.04 19:18) [51]
А мне-то какой смысл смотреть - у меня все работает согласно описанному в документации.
Я вот не понимаю, неужели самому так трудно посмотреть, какие символы заносятся, вместо того, чтобы флейм на 50 постов разводить.
← →
Piter © (2004-11-07 22:23) [53]Игорь Шевченко © (07.11.04 21:16) [52]
Я вот не понимаю, неужели самому так трудно посмотреть, какие символы заносятся
Игорь, а разве непонятно какие символы заносятся? Я вроде раз 150 сказал, что данный пример у меня записывает "Form1" без записи терминирующего символа. Я это говорю на каждой странице. Только видимо никто не слушает?
← →
Игорь Шевченко © (2004-11-07 22:25) [54]Piter © (07.11.04 22:23) [53]
Knowledge Base смотрел ?
← →
_silver © (2004-11-08 00:03) [55]У меня WIN2000 pro SP3 rus.
И этот глюк(а может и не глюк, просто ни когда не приходило в голову определять длину заголовка без +1) имеет место быть.
← →
Piter © (2004-11-08 12:17) [56]Игорь Шевченко © (07.11.04 22:25) [54]
Knowledge Base смотрел ?
нет. А на что смотреть?
← →
Piter © (2004-11-08 17:33) [57]Игорь Шевченко © (07.11.04 17:57) [50]
Насчет заголовков окон длиннее 260 символов - так GetWindowText обрежет
ага, обрежет. А том то и дело, что на некоторых системах она неверно обрежет строку, что явно может привести к некорректной работе приложения.
Правда, некоторые личности утверждают, что это проблема программиста, нефиг мол передавать "неправильные" параметры...
← →
Игорь Шевченко © (2004-11-09 11:09) [58]Piter © (08.11.04 12:17) [56]
> нет. А на что смотреть?
На пофиксенные баги, разумеется. Все пофиксенные баги отражаются в knowlegde base в MSDN. Если ты там не нашел чего-то, то баг не в функции GetWindowText, а где-то еще.
← →
kaZaNoVa © (2004-11-09 14:08) [59]Piter © (07.11.04 19:18) [51]
> Данный код выдает "Form1"
у меня на 2003 выдаёт "Form" !!!!
I := GetWindowTextLength(Handle)+1;
SetLength(S, I);
GetWindowText(Handle, PChar(S), I);
выдаёт Form1 ;))))
← →
kaZaNoVa © (2004-11-09 14:09) [60]Игорь Шевченко © (09.11.04 11:09) [58]
в 2003 снова этот баг ;))))))
← →
Piter © (2004-11-09 19:55) [61]kaZaNoVa © (09.11.04 14:08) [59]
у меня на 2003 выдаёт "Form" !!!!
ну так и должно выдавать имеено так... А у меня выдает "Form1" - глюк.
Игорь Шевченко © (09.11.04 11:09) [58]
На пофиксенные баги, разумеется. Все пофиксенные баги отражаются в knowlegde base в MSDN
я даже не знаю как искать... может, вы посмотрите? :)
← →
kaZaNoVa © (2004-11-09 21:11) [62]Piter © (09.11.04 19:55) [61]
а .. понятно, это я перепутал ... ;(
а ввобще-то имхо form1 как-то логичнее .. :)
← →
Nous Mellon © (2004-11-09 22:06) [63]
> а ввобще-то имхо form1 как-то логичнее .. :)
Ты похоже даже не понял смысл ветки
← →
Nous Mellon © (2004-11-09 22:07) [64]Мишань, поддерживаю. Мастера занаезжались немного. Обвиняют в тупизне не читая вопроса.
← →
Piter © (2004-11-09 22:47) [65]Nous Mellon © (09.11.04 22:07) [64]
спасибо :)
← →
Piter © (2004-11-09 22:52) [66]Игорь Шевченко © (09.11.04 11:09) [58]
поискал, поискал - ничего не нашел. Может, мелкий баг и не описали? А может плохо ищу...
← →
Германн © (2004-11-10 05:30) [67]Удалено модератором
← →
Германн © (2004-11-10 05:33) [68]Удалено модератором
← →
Игорь Шевченко © (2004-11-10 11:12) [69]Piter © (09.11.04 19:55) [61]
> я даже не знаю как искать... может, вы посмотрите? :)
Я тоже не нашел. Нашел про Win32s 1.25 но немного другое, про возвращаемое значение.
← →
SPeller © (2004-11-10 13:52) [70]Я тоже ради интереса посмотрел на КВ - ничего кроме [69] не нашел. Быть може это действительно баг?
← →
GuAV © (2004-11-11 01:36) [71]Piter © (06.11.04 1:22) [11]
Но как только переключитесь на окно чужого приложения
To retrieve the text of a control in another process, send a WM_GETTEXT message directly instead of calling GetWindowText.
Если бы наоборот - пикало бы на своё - то всё бы было ваще правильно :)
У меня в 98 всегда пикает.
← →
Piter © (2004-11-11 10:20) [72]SPeller © (10.11.04 13:52) [70]
Быть може это действительно баг?
ну по моему очевидный баг. Причем явно исправленный...
Давайте так - у меня сейчас SP2. Я создам EXE"шник - посмотрю выводимые значения. Потом поставлю SP4 и запущу тот же EXE"шик - если такого поведения не будет, значит просто не упомянули про это...
Страницы: 1 2 вся ветка
Форум: "Потрепаться";
Текущий архив: 2004.11.28;
Скачать: [xml.tar.bz2];
Память: 0.61 MB
Время: 0.042 c