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

Вниз

Надёжность GetWindowLong(H, GWL_USERDATA)   Найти похожие ветки 

 
О-Сознание   (2013-04-03 20:17) [0]

Посмотрел, очень много кода в VCL держится на получении информации через эту функцию.
А вдруг прогер перепишет её?
Или кто-то сторонний.

Всё разрушится.

Как-то не надёжно получается. (Поправьте меня)


 
Германн ©   (2013-04-03 20:21) [1]


> А вдруг прогер перепишет её?

WinAPI-шную функцию?


 
clickmaker ©   (2013-04-03 20:21) [2]

> А вдруг прогер перепишет её?

прогер в MS? и как ее можно переписать, чтобы всё разрушилось?


 
брат Птибурдукова   (2013-04-03 20:25) [3]

Прогерия — очень редкое заболевание. Шансы на то, что её перепишет прогер, исчезающе малы.


 
О-Сознание   (2013-04-03 20:30) [4]


>  Германн ©   (03.04.13 20:21) [1]
>
>
> > А вдруг прогер перепишет её?
>
> WinAPI-шную функцию?


Перепишет информацию через SetWindowLong.
Логично же.


 
clickmaker ©   (2013-04-03 20:40) [5]

> очень много кода в VCL держится на получении информации
> через эту функцию

кстати, а какого кода? В Д7 я нашел только объявление в Windows.pas


 
О-Сознание   (2013-04-03 20:47) [6]


> clickmaker ©   (03.04.13 20:40) [5]
>
> > очень много кода в VCL держится на получении информации
> > через эту функцию
>
> кстати, а какого кода? В Д7 я нашел только объявление в
> Windows.pas
>  


Лень искать.
Чисто для примера, где обычно применяется:


uses Clipbrd;



function NewEditProc(wnd:HWND; uMsg:UINT; wParam:WPARAM; lParam:LPARAM):integer; stdcall;

var

s:string;

i:integer;

begin

if (uMsg=WM_PASTE) and Clipboard.HasFormat(CF_TEXT) then

begin

s := Clipboard.AsText;

for i:=1 to Length(s) do if (not (s[i] in ["0".."9"])) then begin uMsg:=0; break end

end;

result:=CallWindowProc(Pointer(GetWindowLong(wnd,GWL_USERDATA)),wnd,uMsg,wParam, lParam)

end;



procedure TForm1.FormCreate(Sender: TObject);

begin

SetWindowLong(Edit1.Handle,GWL_STYLE,GetWindowLong(Edit1.Handle,GWL_STYLE) or ES_NUMBER);

SetWindowLong(Edit1.Handle,GWL_USERDATA,SetWindowLong(Edit1.Handle, GWL_WNDPROC, LPARAM(@NewEditProc)))

end;



 
clickmaker ©   (2013-04-03 20:50) [7]

> Лень искать

я поискал за тебя. Ни в Д7, ни в XE3 нету использования GWL_USERDATA


 
О-Сознание   (2013-04-03 20:55) [8]


> clickmaker ©   (03.04.13 20:50) [7]
>
> > Лень искать
>
> я поискал за тебя. Ни в Д7, ни в XE3 нету использования
> GWL_USERDATA


Да не суть.
Использование GWL_USERDATA - не надёжно.


 
брат Птибурдукова   (2013-04-03 21:02) [9]

Аминь.


 
Rouse_ ©   (2013-04-03 21:13) [10]

GWL_USERDATA и DWL_USER это аналоги Tag у VCL классов.
О какой надежности ты говоришь? Это обычная переменная, не более того.
Буфером обмена тоже страшно пользоваться - его тоже постоянно все кому не лень очищают, но как-то живем...


 
clickmaker ©   (2013-04-03 21:24) [11]

Тэгами тоже ненадежно. И вообще, жить страшно


 
О-Сознание   (2013-04-03 21:40) [12]


> Rouse_ ©   (03.04.13 21:13) [10]


Это всё понятно.
GWL_USERDATA напрашивается записать туда.
Т.е. код, допустим тот что выше - не заработает.
Поэтому можно словить глюк использую такой код из чужой либы.
Почему бы не сделать защищенную глобальную переменную внутри либы?
Вместо указателя на WndProc получим нечто и всё полетит.

Зачем использовать GWL_USERDATA?


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


Что страшного?


 
О-Сознание   (2013-04-03 21:40) [13]

Думаю это тянет на небольшую заметку для Реймона Чена.


 
О-Сознание   (2013-04-03 21:41) [14]

* От Реймона Чена.


 
DVM ©   (2013-04-03 21:45) [15]


> О-Сознание   (03.04.13 21:40) [13]
> Думаю это тянет на небольшую заметку для Реймона Чена.

Ни на что это не тянет, паранойя это.


 
брат Птибурдукова   (2013-04-03 23:21) [16]


> Думаю это тянет на небольшую заметку для Реймона Чена
Сам себя не похвалишь — сидишь как оплёванный…


 
clickmaker ©   (2013-04-03 23:26) [17]

> От Реймона Чена.

Ага, пусть мир наконец узнает, в чем причина всех глюков от MS


 
Игорь Шевченко ©   (2013-04-03 23:42) [18]

Мне бы ваши заботы, господин учитель


 
О-Сознание   (2013-04-04 00:09) [19]


> DVM ©   (03.04.13 21:45) [15]


Читайте переводы у GunsМокера и
сравнивайте, так такие же маленькие заметки.

Да чего вы к нему привязались?
Прокомментируйте лучше 12 пост.


> Игорь Шевченко ©   (03.04.13 23:42) [18]
>
> господин учитель


Я не учу, а спрашиваю.


 
О-Сознание   (2013-04-04 00:11) [20]


> брат Птибурдукова   (03.04.13 23:21) [16]
>
>
> > Думаю это тянет на небольшую заметку для Реймона Чена
> Сам себя не похвалишь — сидишь как оплёванный…


Левое слово пока в тред не вставишь, зря на ДМ заходил.


 
имя   (2013-04-04 01:44) [21]

Удалено модератором


 
DVM ©   (2013-04-04 10:18) [22]


> О-Сознание   (04.04.13 00:09) [19]


> Да чего вы к нему привязались?
> Прокомментируйте лучше 12 пост.

А чего там комментировать? GWL_USERDATA такая же переменная как и любая другая, только привязанная к структурам окна. Разумеется в нее можно записать, т.к. есть отдельная функция для этого. Как впрочем можно записать и в любую другую область памяти, тем самым нарушив работу какого то кода.
Тебя не беспокоит, что вообще можно попортить многие структуры в Windows, указатели на которые ты получаешь под видом хэндлов? И ничего живут люди и программы.

Тебя беспокоит тот факт, то эту переменную кто-то кроме тебя одновременно с с тобой станет использовать для одного и того же окна? Ну так документировать надо данный факт, еще проверять, не записано ли там что-то перед использованием. А вообще эта переменная исключительно для пользовательского конечного кода, библиотеки не должны ее использовать.


 
О-Сознание   (2013-04-04 11:18) [23]


> DVM ©   (04.04.13 10:18) [22]
>
>
> > О-Сознание   (04.04.13 00:09) [19]
>
>
> > Да чего вы к нему привязались?
> > Прокомментируйте лучше 12 пост.
>
> А чего там комментировать? GWL_USERDATA такая же переменная
> как и любая другая, только привязанная к структурам окна.
>  Разумеется в нее можно записать, т.к. есть отдельная функция
> для этого. Как впрочем можно записать и в любую другую область
> памяти, тем самым нарушив работу какого то кода.
> Тебя не беспокоит, что вообще можно попортить многие структуры
> в Windows, указатели на которые ты получаешь под видом хэндлов?
>  И ничего живут люди и программы.
>
> Тебя беспокоит тот факт, то эту переменную кто-то кроме
> тебя одновременно с с тобой станет использовать для одного
> и того же окна? Ну так документировать надо данный факт,
>  еще проверять, не записано ли там что-то перед использованием.
>  А вообще эта переменная исключительно для пользовательского
> конечного кода, библиотеки не должны ее использовать.
>


Вот об этом и говорю.
Не должны, но могут.

Портить хэндлы явный пример не правильного использования.
А юзер-дата - общая штука.

Надо помнить, что её может использовать кто-то другой.
И нужно перестраховаться на всякий случай, некто возьмёт и поместит код выше в либу, забудет, а потом будет удивляться почему не работает ничего.


 
clickmaker ©   (2013-04-04 11:22) [24]

> некто возьмёт и поместит код выше в либу, забудет, а потом
> будет удивляться почему не работает ничего

ССЗБ


 
брат Птибурдукова   (2013-04-04 11:29) [25]


> некто возьмёт и поместит код выше в либу, забудет, а потом
> будет удивляться почему не работает ничего
ага, "не будем показывать пальцем", как говорится


 
Игорь Шевченко ©   (2013-04-04 12:52) [26]

There"s no limit to how bad things can get


 
О-Сознание   (2013-04-05 20:02) [27]


> брат Птибурдукова   (04.04.13 11:29) [25]
>
>
> > некто возьмёт и поместит код выше в либу, забудет, а потом
> > будет удивляться почему не работает ничего
> ага, "не будем показывать пальцем", как говорится


Ты за словами следить не пробовал?
Например, обработать приватные поля окна в WndProc делают через эту
функцию. Потом копируют и удивляются.


> clickmaker ©   (04.04.13 11:22) [24]
>
> > некто возьмёт и поместит код выше в либу, забудет, а потом
> > будет удивляться почему не работает ничего
>
> ССЗБ


Дык про это и речь, чтобы их не было.


 
Rouse_ ©   (2013-04-05 20:12) [28]


> О-Сознание   (05.04.13 20:02) [27]

Ты чего боишься то в итоге? То что тебе извне перепишут GWL_USERDATA?
А то что тебя извне могут открыть под отладчиком и вообще перекроить логику работы твоей программы - не боишься?
Плюнь и забудь - данное поле предназначено для программистов. Если программист переписывает данное поле, то не важно есть там твое значение или нет - программист явно знает что он делает.


 
брат Птибурдукова   (2013-04-05 20:21) [29]


> Ты за словами следить не пробовал?
И за словами, и за байтами, и за двойными словами следил… Теперь вот с этой ихней 64-битностью и за квад-словами следить придётся иногда.


 
картман ©   (2013-04-05 21:34) [30]

http://www.youtube.com/watch?v=Be1ZHRri78I


 
О-Сознание   (2013-04-07 17:31) [31]


> Rouse_ ©   (05.04.13 20:12) [28]
>
>
> > О-Сознание   (05.04.13 20:02) [27]
>  программист явно знает
> что он делает.
>


Ну-ну.



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

Текущий архив: 2013.09.15;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.009 c
2-1356513986
Tvanges
2012-12-26 13:26
2013.09.15
Сливание pdf


2-1357388251
Евгений07
2013-01-05 16:17
2013.09.15
исчезает Image при простых действиях


4-1267176656
istok
2010-02-26 12:30
2013.09.15
Запуск процесса под юзером...


15-1365021003
Юрий
2013-04-04 00:30
2013.09.15
С днем рождения ! 4 апреля 2013 четверг


6-1269263709
DevilDevil
2010-03-22 16:15
2013.09.15
Считать HTML c VKontakte