Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.11.28;
Скачать: CL | DM;

Вниз

Непонятна работа 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;
Скачать: CL | DM;

Наверх




Память: 0.63 MB
Время: 0.028 c
3-1098919357
Wital
2004-10-28 03:22
2004.11.28
Change ADO Langdriver Paradox


14-1100084773
Holy
2004-11-10 14:06
2004.11.28
О нечистой силе, компах и бубне...


4-1098041108
AlexeyM
2004-10-17 23:25
2004.11.28
перехват вызова Win api в другом приложении


4-1098169182
Ander
2004-10-19 10:59
2004.11.28
Список установленных в системе языков


1-1100628629
rom
2004-11-16 21:10
2004.11.28
проблемы с перерисовкой надписи