Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 2004.11.28;
Скачать: [xml.tar.bz2];

Вниз

Непонятна работа GetWindowText   Найти похожие ветки 

 
Piter ©   (2004-11-05 22:39) [0]

Возьмем вот такой код:

procedure TForm1.Timer1Timer(Sender: TObject);
var
 FW: HWND;
 s: string;
 i: integer;
begin
 FW := GetForegroundWindow ;
 i := GetWindowTextLength(FW);
 SetLength(s, i);
 i := GetWindowText(FW, PChar(s), i);
 Edit1.text := s;
end;

И как-то странно получается. Для всех окон, которые я пробовал, записывается заголовок за исключением последнего символа. А последним символом в S идет #0. С какого перепуга он туда пишется?

Ну допустим я это еще могу понять, просто надо SetLength делать на 1 больще.
Но! Если таким образом узнавать заголовок собственного окна - то код работает как я и ожидал - то есть, возвращает полностью заголовок.

Если не понятно - приведу пример. Допустим, в фокусе сейчас окно редактора кода, заголовок "unit1.pas". На первом присвоении I получается 9, что верно. На втором присвоении I получается 8! Девятым символом в S записывается #0. Это можно объяснить.

Но если в фокусе форма моего приложения, которая имеет заголовок "Form1", то на первом присвоении I равно 5, что также верно. А на втором присвоении I получается тоже 5! При этом никакой записи #0 в последний символ S не происходит!

Замечу, что код у меня именно такой, я его скопировал из окна редактора кода.

После серии экспериментов я пришел только к одному мнению - если функция возвращает заголовок окна своего потока, то она работает "правильно" - то есть, какое количество символов ты хочешь скопировать - такое она и копирует. Если же окно относится к другому потоку (или процессу - не проверял), то она копирует иначе.

Сижу и думаю - меня глючит что ли? Или это такой глюк в windows? По идее, вероятнее, что глючит меня, так как баг то вроде простой и его давно бы заметили, а я ничего такого не слышал. С другой стороны, код тоже элементарный, все на ладони, ходил с отладчиком - никаких погрешностей в своем коде не обнаружил.

Кто что скажет?


 
Игорь Шевченко ©   (2004-11-05 23:06) [1]

GetWindowTextLength

"If the function succeeds, the return value is the length, in characters, of the text. Under certain conditions, this value may actually be greater than the length of the text".
"If the target window is owned by the current process, GetWindowTextLength causes a WM_GETTEXTLENGTH message to be sent to the specified window or control."

"Under certain conditions, the GetWindowTextLength function may return a value that is larger than the actual length of the text. This occurs with certain mixtures of ANSI and Unicode, and is due to the system allowing for the possible existence of double-byte character set (DBCS) characters within the text. The return value, however, will always be at least as large as the actual length of the text; you can thus always use it to guide buffer allocation."

"To obtain the exact length of the text, use the WM_GETTEXT, LB_GETTEXT, or CB_GETLBTEXT messages, or the GetWindowText function."

GetWindowText
"If the window text string is as long or longer than the buffer, the string is truncated and terminated with a NULL character. "

"nMaxCount
[in] Specifies the maximum number of characters to copy to the buffer, including the NULL character. If the text exceeds this limit, it is truncated. "


 
Piter ©   (2004-11-05 23:51) [2]

Игорь Шевченко ©   (05.11.04 23:06) [1]
"If the target window is owned by the current process, GetWindowTextLength causes a WM_GETTEXTLENGTH message to be sent to the specified window or control."


тут по-моему неграмотно написано. У меня хелп от D7 и там вот что написано:

"If the function succeeds, the return value is the length, in characters, of the text. Under certain conditions, this value may actually be greater than the length of the text. For more information, see the following Remarks section."

Соответственно Remarks:

"This function causes a WM_GETTEXTLENGTH message to be sent to the specified window or control."

Ну и далее там идет ваш текст "Under certain conditions..."

Никаких current process.

Игорь Шевченко ©   (05.11.04 23:06) [1]
"nMaxCount
[in] Specifies the maximum number of characters to copy to the buffer, including the NULL character. If the text exceeds this limit, it is truncated. "


хм, у меня опять же по другому:

"nMaxCount

Specifies the maximum number of characters to copy to the buffer. If the text exceeds this limit, it is truncated"

Ну допустим эту фразу "including the NULL character" я предполагал в первом своем посте. Допустим, так (хоть у меня в хелпе этого и не написано). Но почему тогда код со своим окном отрабатывает корректно?

Из ваших пояснений я не понял ответа на свой вопрос...


 
Игорь Шевченко ©   (2004-11-06 00:03) [3]

Piter ©   (05.11.04 23:51) [2]


> тут по-моему неграмотно написано


Да, Microsoft отличается изрядной неграмотностью при составлении документации, это я тоже отметил.

Однако даже неграмотное описание, на мой взгляд, соответствует описанной тобой ситуации.


 
_silver ©   (2004-11-06 00:31) [4]

Piter ©   (05.11.04 22:39)

А так???

function GetWndText(WndH : HWND) : string;
var
 s : string;
 Len : integer;
begin
 Len := GetWindowTextLength(WndH)+1;
 if Len > 1 then
   begin
     SetLength(s, Len);
     GetWindowText(WndH, @s[1], Len);
     Result := s;
   end
end;


 
Игорь Шевченко ©   (2004-11-06 00:46) [5]

Кстати, интересно - функции GetWindowText и GetWindowTextLength всегда посылают окну сообщения WM_GETTEXTLENGTH и WM_GETTEXT, в случае окна своего процесса функции посылают сообщение через DefWindowProc, а в случае чужого через SendMessage.


> Если таким образом узнавать заголовок собственного окна
> - то код работает как я и ожидал - то есть, возвращает полностью
> заголовок.


Давай ты примерчик напишешь, который можно скопировать в среду, запустить и убедиться, что поведение именно такое, как ты описываешь.


 
_silver ©   (2004-11-06 00:55) [6]

Игорь Шевченко ©   (06.11.04 0:46) [5]
Прошу всётаки обратить внимание на

> _silver ©   (06.11.04 0:31) [4][Ответить]

и сравнить результат с

> Piter ©   (05.11.04 22:39) [Ответить]


 
Piter ©   (2004-11-06 01:01) [7]

Игорь Шевченко ©   (06.11.04 0:03) [3]
Да, Microsoft отличается изрядной неграмотностью при составлении документации, это я тоже отметил


минуту думал - это вы иронизировали или серьезно сказали? Так и не пришел к заключению :)

Игорь Шевченко ©   (06.11.04 0:03) [3]
Однако даже неграмотное описание, на мой взгляд, соответствует описанной тобой ситуации


на мой взгляд не соответствует. Объясните чайнику:

> Но почему тогда код со своим окном отрабатывает
> корректно?


Я вообще не понимаю почему вы привели описание
GetWindowTextLength
эта функция то как раз абсолютно корректно отрабатывает. Проблема в
GetWindowText
перефразирую свой вопрос в третий раз (может, вам лень читать первый большой пост?) - почему для чужих окон ДЕЙСТВУЕТ приписка "including the NULL character", а для своего окна нет.

Кстати, вы из MSDN цитировали?

_silver ©   (06.11.04 0:31) [4]
А так???


а что так? Ну ясен пень работает, но это не ответ на вопрос.
Причем работает из-за +1 естественно, а не из-за @s[1], ибо это тоже самое, что и PChar(s)


 
Игорь Шевченко ©   (2004-11-06 01:08) [8]

Piter ©   (06.11.04 01:01) [7]


> минуту думал - это вы иронизировали или серьезно сказали?
> Так и не пришел к заключению :)


Иронизировал. Так как мои цитаты приведены из последней MSDN.
Хотя, ошибки есть и там, но все же не настолько по сравнению с Help из D7.

Кстати, в какой системе проявляется такое поведение ?


 
Игорь Шевченко ©   (2004-11-06 01:12) [9]


> procedure TForm1.Timer1Timer(Sender: TObject);
> var
>  FW: HWND;
>  s: string;
>  i: integer;
> begin
>  FW := GetForegroundWindow ;
>  i := GetWindowTextLength(FW);
>  SetLength(s, i);
>  i := GetWindowText(FW, PChar(s), i);
>  Edit1.text := s;
> end;


unit main;

interface
uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls;

type
 TForm1 = class(TForm)
   Button1: TButton;
   procedure Button1Click(Sender: TObject);
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
 S: string;
 I: Integer;
begin
 I := GetWindowTextLength(Button1.Handle);
 SetLength(S, I);
 GetWindowText(Button1.Handle, PChar(S), I);
 ShowMessage(S);
end;

end.


ShowMessage показывает "Button"

Система - Win2k


 
_silver ©   (2004-11-06 01:14) [10]

Piter ©   (06.11.04 1:01) [7]
Признаю свою ошибку...
Проверил, действительно не понятно...
Без +1 заголовки окон своего приложения возвращает правильно, окон других приложений на один символ меньше.
?


 
Piter ©   (2004-11-06 01:22) [11]

Игорь Шевченко ©   (06.11.04 0:46) [5]
Давай ты примерчик напишешь, который можно скопировать в среду, запустить и убедиться, что поведение именно такое, как ты описываешь


да вообще-то примерчик в моей первом посту. Ну можно еще более наглядно:

кидайте таймер на форму, интервал - 1 сек:

procedure TForm1.Timer1Timer(Sender: TObject);
var
 FW: HWND;
 s: string;
 i: integer;
begin
 FW := GetForegroundWindow ;
 i := GetWindowTextLength(FW);
 SetLength(s, i);
 GetWindowText(FW, PChar(s), i);
 if Pos(#0, s)>0 then
   beep;
end;


как видно, код прямо не привязан к тому, свое или не свое окно. Однако же, если в фокусе будет свое окно (окно вашего приложения) - пиканья (beep) вы не услышите. Но как только переключитесь на окно чужого приложения - услышите пиканье.

Знаете, меня даже порадовало - такой недокументированный способ определения - свое или не свое окно :)

P.S. Windows 2000 rus + SP2 + D7


 
Piter ©   (2004-11-06 01:32) [12]

Игорь Шевченко ©   (06.11.04 1:12) [9]
ShowMessage показывает "Button"


аналогично. Ситуация становится все интернеснее :)
Получается, исключительное поведение для СВОИХ окон верхнего уровня?

Теперь интересно выяснить - под своими понимается своего процесса или своего потока? :)

Но сейчас я спать, глаза слипаются...


 
Piter ©   (2004-11-06 01:32) [13]

Игорь Шевченко ©   (06.11.04 1:08) [8]
приведены из последней MSDN


апрельской? Или какая новая вышла?
Или вы с сайта?


 
Игорь Шевченко ©   (2004-11-06 01:33) [14]

Piter ©   (06.11.04 01:22) [11]

Пост [9] - что я делаю не так ? Когда я заменяю Button1.Handle на просто Handle, ShowMessage честно выводит "Form", то есть, все работает в соответствии с описанием.


 
Игорь Шевченко ©   (2004-11-06 01:34) [15]

Piter ©   (06.11.04 01:32) [13]

С сайта


 
SPeller ©   (2004-11-06 06:12) [16]

Я думаю что это проделки VCL. В KOL код [11] пикает вне зависимости от того, свое окно или нет.


 
Игорь Шевченко ©   (2004-11-06 11:04) [17]

SPeller ©   (06.11.04 06:12) [16]

А где ты увидел VCL в данном случае ? Саша, думать, оно конечно, неплохо, но анализировать код - еще лучше.


 
Verg ©   (2004-11-06 11:40) [18]

Specifies the maximum number of characters to copy to the buffer, including the NULL character. If the text exceeds this limit, it is truncated.

Вот и вопрос - как оно truncated. Можно так, что просто обсечь, забив на 0, а можно так, чтобы 0 -терминатор был таки, т.е. укоротив значущую часть строки. Это тебе в Delphi string-ах в сущьности пофигу есть этот 0-терминатор или нет.
Я считаю, что при передаче неверного значения парамера, ф-ция вольна поступать как ей вздумается, не нарушая общих принципов защиты. К чему эти выяснялки - почиму на неверно заданный параметр ф-ция ведет себя неоднозначно. Передавай все правильно, и будет тебе счастье.


 
Piter ©   (2004-11-06 13:01) [19]

Игорь Шевченко ©   (06.11.04 1:33) [14]
Пост [9] - что я делаю не так ? Когда я заменяю Button1.Handle на просто Handle, ShowMessage честно выводит "Form",


Игорь, вы в этом уверены? У меня выводит именно "Form1"

SPeller ©   (06.11.04 6:12) [16]
В KOL код [11] пикает вне зависимости от того, свое окно или нет


угу, судя по всему, у Игоря тоже самое. Какая система у тебя (включая сервис паки)?

Игорь, и какая система у вас (включая сервис паки)?

У меня W2k SP2.

Verg ©   (06.11.04 11:40) [18]
including the NULL character


а в справке по D7 этого нету :(

Я считаю, что при передаче неверного значения парамера, ф-ция вольна поступать как ей вздумается

Verg ©   (06.11.04 11:40) [18]
Вот и вопрос - как оно truncated. Можно так, что просто обсечь, забив на 0, а можно так, чтобы 0 -терминатор был таки, т.е. укоротив значущую часть строки


да, ты верно сформулировал. В функцию передается число символов на 1 меньше, чем нужно передать, чтобы получить полный заголовок. В документации написано, что в этом случае произойдет усечение строки. Но вот факт в том, что в случае своих окон он усекает одним способом, а в случае чужих окон другим. Интересно - почему?

При этом сама MS, видимо, все таки считает это за ошибку, потому как явно исправила ее. Этот код:

procedure TForm1.Button1Click(Sender: TObject);
var
S: string;
I: Integer;
begin
I := GetWindowTextLength(Button1.Handle);
SetLength(S, I);
GetWindowText(Handle, PChar(S), I);
ShowMessage(S);
end;


выдает мне "Form1". А Игорю выдается "Form".
У меня SP2, а я думаю у Игоря SP3 или SP4. Интересно, еще на WinXP проверить и win9x.

Так что данное несоответствие между своими и чужими окнами проявляется на некоторых системах (старых достаточно) со своими окнами верхнего уровня. Вон оно как (если в коде заменить Handle на Button1.Handle - то все работает как надо).

P.S. Провел таки эксперименты - на Windows ME и Windows XP работает как надо, то есть как в MSDN сказано. Пока неправильное поведение обнаружил только на Windows 2000 SP2 на своих окнах верхнего уровня.

P.S.S. А вообще, не понимаю - нафига GetWindowText пишет нулевой символ? Кому это надо... неудобно использовать, получается два нулевых символа подряд...


 
Verg ©   (2004-11-06 13:08) [20]


>  вообще, не понимаю - нафига GetWindowText пишет нулевой
> символ?


Здрасте. GetWindowText - ф-ция API.
С API ф-циями работают программируя не только на Delphi :)


 
Verg ©   (2004-11-06 13:13) [21]


> Но вот факт в том, что в случае своих окон он усекает одним
> способом, а в случае чужих окон другим. Интересно - почему?


Наверно этот механизм реализован в двух разных кусках кода для двух этих случаев. Может даже писанных разными людьми. Один так понял truncate, другой - иначе. :) Делов-то...


 
Piter ©   (2004-11-06 13:19) [22]

Verg ©   (06.11.04 13:08) [20]

Знаю :)

Verg ©   (06.11.04 13:08) [20]

тиы вот скажи лучше - у тебя "глюк" проявляется на своих окнах верхнего уровня? И какая у тебя система?


 
Piter ©   (2004-11-06 13:19) [23]

Verg ©   (06.11.04 13:13) [21]
Наверно этот механизм реализован в двух разных кусках кода для двух этих случаев


а зачем для своих окон делать один код, а для чужих - другой?


 
Verg ©   (2004-11-06 13:26) [24]

С точки зрения программирования на C - у меня truncate делается "корректно", т.е. усечением заначащей части строки - чтобы терм. 0 был в любом случае.

Windows 2000 Pro RUS SP4


 
Verg ©   (2004-11-06 13:32) [25]


> а зачем для своих окон делать один код, а для чужих - другой?


Странный вопрос.
Ответ: Так получилось. Может быть случайно, а может и нет - в каждом большом проекте можно найти нелогичности, не приводящие, тем не менее к неработоспособности. По мере "подчистки" обычно накие нелогичности устраняются и вклюяаются в сервиспаки, апдейты и т.д.


 
GuAV ©   (2004-11-06 13:36) [26]

procedure TForm1.Button1Click(Sender: TObject);
var
S: string;
I: Integer;
begin
I := GetWindowTextLength(Button1.Handle);
SetLength(S, I);
GetWindowText(Handle, PChar(S), I + SizeOf(#0));
ShowMessage(S);
end


 
Piter ©   (2004-11-06 15:47) [27]

Piter ©   (06.11.04 13:19) [23]
Windows 2000 Pro RUS SP4


угу. Понятно. Где-то на уровне SP3, SP4 ошибку исправили, видимо. В SP2 она присутствует.
В WindowsME и WinXP (без сервис паков) все ок.


 
VID ©   (2004-11-06 17:41) [28]

Piter, проверь на машине с Win2k.SP<=2 этот код
Function _GetWindowText(HWND:THandle):String;
var
 WindowText : PChar;
 TextSize : DWORD;
begin
Result := ""; WindowText := #0;
TextSize := GetWindowTextLength(HWND)+1;
try
 GetMem(WindowText, TextSize);
 GetWindowText(HWND, WindowText, TextSize);
 Result:= StrPas(WindowText);
finally
 FreeMem(WindowText);
end;
end;

самому интересно будет ли описанный глюк или нет.


 
Игорь Шевченко ©   (2004-11-06 17:42) [29]

Piter ©   (06.11.04 13:01) [19]

Win2k Pro SP3(4) Rus


 
Игорь Шевченко ©   (2004-11-06 17:48) [30]

Кроме того, я уже писал в чем отличие работы этих функций для окно своего и чужого процессов.


 
Piter ©   (2004-11-06 18:31) [31]

VID ©   (06.11.04 17:41) [28]
самому интересно будет ли описанный глюк или нет.


даже проверять не хочу:

TextSize := GetWindowTextLength(HWND)+1

ты где вообще был то? Какие посты читал?

Игорь Шевченко ©   (06.11.04 17:42) [29]
Win2k Pro SP3(4) Rus


ясно. Значит, вероятно этот глюк в Win2000-SP2.
А исправили в SP3


 
Игорь Шевченко ©   (2004-11-06 18:57) [32]

Piter ©   (06.11.04 18:31) [31]

Сдается мне, что глюка быть не должно. В противном случае о нем бы было известно, начиная с NT4, где, собственно говоря, и изменился механизм работы с окнами. Поищи в MSDN в Knowledge Base, если там ничего нету, то глюк конкретно у тебя, IMHO.


 
Piter ©   (2004-11-06 19:36) [33]

Игорь Шевченко ©   (06.11.04 18:57) [32]
Поищи в MSDN в Knowledge Base, если там ничего нету, то глюк конкретно у тебя, IMHO.


сомневаюсь. Что, у меня win 2000 специальная что ли?
Вот пожалуйста:


_silver ©   (06.11.04 1:14) [10]
>Признаю свою ошибку...
>Проверил, действительно не понятно...
> Без +1 заголовки окон своего приложения возвращает
> правильно, окон других приложений на один символ меньше


Так что не только у меня. Просто найдите windows 2000 SP2 или меньше. И увидете.
Я ведь ничего не мудрил - я и ваш код использовал, у меня показывается "Form1".


 
марсианин ©   (2004-11-06 20:36) [34]

у меня в WinXP HE без сервис-паков - такая же фигня

но это только для окна Form1, если любое другое (в т.ч. и свои контролы), то все ок


 
Игорь Шевченко ©   (2004-11-06 20:53) [35]

Piter ©   (06.11.04 19:36) [33]

Из GetWindowText:
"nMaxCount
[in] Specifies the maximum number of characters to copy to the buffer, including the NULL character. If the text exceeds this limit, it is truncated. "

Из GetWindowTextLength
"If the function succeeds, the return value is the length, in characters, of the text".


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;


Вот мой код работает точно по приведенному описанию. Из чего я делаю вывод, что дело не в Windows.
Я тебе искренне советую посмотреть свой код отладчиком, можно даже в CPU Window залезть, чтобы понять, в чем причина.


 
Verg ©   (2004-11-06 21:04) [36]

ой, парни, ну в конце концов, я уже говорил - не перекладывайте вы "с больной головы на здоровую" - указыайте правильно параметры при вызовах API ф-ций, и будет все зашибись. Какой еще "глюк"? :) Не смешите мои тапочки. :))
Piter - пытался тебе объянить эту простую мысль, нет, тебя клинануло на "глюк Windows", стал же таки выяснять, по сути, "какая винда из сервис паков лучче отрабатывает глючные параметры".

Разбираться, что если свернуть башку водопроводному крану - почему в одной квартире вода потекла налево, а в другой направо? Бред.


 
Игорь Шевченко ©   (2004-11-06 21:39) [37]

Verg ©   (06.11.04 21:04) [36]

Зачем разный код при обращении к окнам своего и чужого процесса:
Для окна своего процесса можно выполнить обработку сообщения WM_GETTEXT посредством вызова DefWindowProc, не переходя в режим ядра, следовательно, быстрее. Для окон чужого процесса этого сделать нельзя, так как код должен выполнится в адресном пространстве чужого процесса и передать данные в процесс, который вызывает GetWindowText, для этого надо построить промежуточный объект-секцию для буфера строки, и т.д. Поэтому для окон чужого процесса посылается сообщение WM_GETTEXT вызовом функции SendMessage.

Кстати, интересующиеся могут поставить эксперимент - создать окно с оконном процедурой, обрабатывающей WM_GETTEXT и возвращающей какую-нибудь лабуду.


 
марсианин ©   (2004-11-06 21:40) [38]

2 [35] Игорь Шевченко ©   (06.11.04 20:53)

I := GetWindowTextLength(Handle);
SetLength(S, I);
GetWindowText(Handle, PChar(S), I);

почему не I := GetWindowTextLength(Handle) + 1;???

в сях strlen("my text") == 7 - количество символов
но  размер буфера, нужного для хранения этой строки, =  (7+1)*sizeof(char)
потому что еще "\0"  сзади

если так написать глюка не будет. нигде.

2[36] Verg ©   (06.11.04 21:04)
насколько я понял проблема в том, что когда GetWindowText обрубает текст в некоторых случаях "\0" не проставляется.. это наблюдается напр для Form1
д.б. Form+\0 при размере буфера 5
т.е все-таки глюк :)


 
Игорь Шевченко ©   (2004-11-06 22:05) [39]

марсианин ©   (06.11.04 21:40) [38]


> почему не I := GetWindowTextLength(Handle) + 1;???


Потому что так было в изначальном коде. Моей целью было продемонстрировать, что для окон своего процесса буфер обрезается точно также.

Я бы делал вообще по-другому, если бы мне нужно было получить текст из окна.


 
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 не выполняется, что может привести к краху программы. Все равно не глюк?



Страницы: 1 2 вся ветка

Форум: "Потрепаться";
Текущий архив: 2004.11.28;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.59 MB
Время: 0.043 c
6-1095681156
Senator
2004-09-20 15:52
2004.11.28
TServerSocket


8-1093413641
Александр1
2004-08-25 10:00
2004.11.28
Заполнение фона


14-1100166369
vopros
2004-11-11 12:46
2004.11.28
Как безопасно бороться с безбашенными соседями?


1-1100198032
grigory
2004-11-11 21:33
2004.11.28
Спрятать приложение


8-1093930316
Erden
2004-08-31 09:31
2004.11.28
wav ..





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский