Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 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
4-1098179804
nastya
2004-10-19 13:56
2004.11.28
узнать тип диска


3-1099310895
Артем К.
2004-11-01 15:08
2004.11.28
Проблемы с вычисляемым полем


1-1100350228
redlord
2004-11-13 15:50
2004.11.28
как узнать сколько занял файл на диске


14-1100016657
Andy BitOff
2004-11-09 19:10
2004.11.28
Вакансия


4-1097946522
Viper
2004-10-16 21:08
2004.11.28
Мышь





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский